#include <iostream>
template < class Real >
class ICovBase {
bool isTrue;
Real* This() {
return static_cast < Real* > (this);
}
public:
virtual bool operator() (int a) const {
std::cout << "Base class () called\n";
return true;
};
ICovBase(int a) {
isTrue = This()->operator()(a);
}
virtual ~ICovBase() {};
};
class Cov : public ICovBase < Cov > {
public:
bool operator () (int a) const {
std::cout << "Child class () called\n";
return (a > 0);
}
Cov(int a): ICovBase < Cov >(a) {
}
};
int main() {
Cov test(5);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPCBjbGFzcyBSZWFsID4KY2xhc3MgSUNvdkJhc2UgewogICAgYm9vbCBpc1RydWU7CiAgICBSZWFsKiBUaGlzKCkgewogICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8IFJlYWwqID4gKHRoaXMpOwogICAgfQogcHVibGljOgogICAgdmlydHVhbCBib29sIG9wZXJhdG9yKCkgKGludCBhKSBjb25zdCB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJCYXNlIGNsYXNzICgpIGNhbGxlZFxuIjsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CiAgICBJQ292QmFzZShpbnQgYSkgewogICAgICAgIGlzVHJ1ZSA9IFRoaXMoKS0+b3BlcmF0b3IoKShhKTsKICAgIH0KICAgIHZpcnR1YWwgfklDb3ZCYXNlKCkge307Cn07CgpjbGFzcyBDb3YgOiBwdWJsaWMgSUNvdkJhc2UgPCBDb3YgPiB7CiBwdWJsaWM6IAogICAgYm9vbCBvcGVyYXRvciAoKSAoaW50IGEpIGNvbnN0IHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkNoaWxkIGNsYXNzICgpIGNhbGxlZFxuIjsKICAgICAgICByZXR1cm4gKGEgPiAwKTsKICAgIH0KICAgIENvdihpbnQgYSk6IElDb3ZCYXNlIDwgQ292ID4oYSkgewogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBDb3YgdGVzdCg1KTsKfQ==