#include <iostream>
using namespace std;
class B {
public:
B() {
// complex initializations
};
virtual int doSomething()
{return 2 * doSomethingHelper();}
protected:
class initialiser {
public:
initialiser(B*b) {b->init();}
};
void init() { // the rest of the what you wanted in constructor
int a = doSomething();
// more complex stuff with `a`
}
virtual int doSomethingHelper() = 0;
};
class C: public B {
public:
protected:
B::initialiser bi{this}; // this truggers automaticcaly the second phase
virtual int doSomethingHelper()
{cout <<"OK"<<endl; return 1;}
};
int main() {
C c;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQiB7CnB1YmxpYzoKICAgIEIoKSB7CiAgICAJLy8gY29tcGxleCBpbml0aWFsaXphdGlvbnMKICAgIH07CiAgICB2aXJ0dWFsIGludCBkb1NvbWV0aGluZygpCiAgICB7cmV0dXJuIDIgKiBkb1NvbWV0aGluZ0hlbHBlcigpO30KCiAgcHJvdGVjdGVkOgogICAgY2xhc3MgaW5pdGlhbGlzZXIgewogICAgcHVibGljOiAKICAgICAgICBpbml0aWFsaXNlcihCKmIpIHtiLT5pbml0KCk7fQogICAgfTsKICAgIHZvaWQgaW5pdCgpIHsgIC8vICB0aGUgcmVzdCBvZiB0aGUgd2hhdCB5b3Ugd2FudGVkIGluIGNvbnN0cnVjdG9yIAogICAgICBpbnQgYSA9IGRvU29tZXRoaW5nKCk7CiAgICAgIC8vIG1vcmUgY29tcGxleCBzdHVmZiB3aXRoIGBhYAogICAgfQogICAgdmlydHVhbCBpbnQgZG9Tb21ldGhpbmdIZWxwZXIoKSA9IDA7Cn07CgoKY2xhc3MgQzogIHB1YmxpYyAgQiB7CnB1YmxpYzogCiBwcm90ZWN0ZWQ6CiAgICBCOjppbml0aWFsaXNlciBiaXt0aGlzfTsgLy8gdGhpcyB0cnVnZ2VycyBhdXRvbWF0aWNjYWx5IHRoZSBzZWNvbmQgcGhhc2UKICAgIHZpcnR1YWwgaW50IGRvU29tZXRoaW5nSGVscGVyKCkKICAgIHtjb3V0IDw8Ik9LIjw8ZW5kbDsgcmV0dXJuIDE7fQp9OwoKaW50IG1haW4oKSB7CiAgQyBjOwogIHJldHVybiAwOwp9Cg==