#include <iostream>
using namespace std;
class B{
public:
virtual void f(){cout << "f() - B" << endl;}
virtual void h() = 0;
virtual ~B(){cout << "~B() destructor" << endl;}
protected:
int b;
};
class D1: virtual public B{
public:
void f(){cout << "f() - D1" << endl;}
virtual ~D1(){cout << "~D1() destructor" << endl;}
protected:
int d1;
};
class D2: virtual public B{
public:
void f(int i){cout << "f(" << i << ") - D2" << endl;}
virtual void h(){cout << "h() - D2" << endl;}
virtual ~D2(){cout << "~D2() destructor" << endl;}
protected:
int d2;
};
class D3: public D1{
public:
void h(){cout << "h() - D3" << endl;}
private:
int d3;
};
class D4: public D1, public D2{
public:
using D1::f; using D2::f;
virtual ~D4(){cout << "~D4() destructor" << endl;}
private:
int d4;
};
int main()
{
B *pB;
pB = new D4;
dynamic_cast<D4*>(pB)->f(3);
delete pB;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEJ7CgpwdWJsaWM6CgogICAgdmlydHVhbCB2b2lkIGYoKXtjb3V0IDw8ICJmKCkgLSBCIiA8PCBlbmRsO30KICAgIHZpcnR1YWwgdm9pZCBoKCkgPSAwOwogICAgdmlydHVhbCB+Qigpe2NvdXQgPDwgIn5CKCkgZGVzdHJ1Y3RvciIgPDwgZW5kbDt9Cgpwcm90ZWN0ZWQ6CgogICAgaW50IGI7Cn07CgpjbGFzcyBEMTogdmlydHVhbCBwdWJsaWMgQnsKCnB1YmxpYzoKCiAgICB2b2lkIGYoKXtjb3V0IDw8ICJmKCkgLSBEMSIgPDwgZW5kbDt9CiAgICB2aXJ0dWFsIH5EMSgpe2NvdXQgPDwgIn5EMSgpIGRlc3RydWN0b3IiIDw8IGVuZGw7fQoKcHJvdGVjdGVkOgoKICAgIGludCBkMTsKfTsKCmNsYXNzIEQyOiB2aXJ0dWFsIHB1YmxpYyBCewoKcHVibGljOgoKICAgIHZvaWQgZihpbnQgaSl7Y291dCA8PCAiZigiIDw8IGkgPDwgIikgLSBEMiIgPDwgZW5kbDt9CiAgICB2aXJ0dWFsIHZvaWQgaCgpe2NvdXQgPDwgImgoKSAtIEQyIiA8PCBlbmRsO30KICAgIHZpcnR1YWwgfkQyKCl7Y291dCA8PCAifkQyKCkgZGVzdHJ1Y3RvciIgPDwgZW5kbDt9Cgpwcm90ZWN0ZWQ6CgogICAgaW50IGQyOwp9OwoKY2xhc3MgRDM6IHB1YmxpYyBEMXsKCnB1YmxpYzoKCiAgICB2b2lkIGgoKXtjb3V0IDw8ICJoKCkgLSBEMyIgPDwgZW5kbDt9Cgpwcml2YXRlOgoKICAgIGludCBkMzsKfTsKCmNsYXNzIEQ0OiBwdWJsaWMgRDEsIHB1YmxpYyBEMnsKCnB1YmxpYzoKCiAgICB1c2luZyBEMTo6ZjsgdXNpbmcgRDI6OmY7CgogICAgdmlydHVhbCB+RDQoKXtjb3V0IDw8ICJ+RDQoKSBkZXN0cnVjdG9yIiA8PCBlbmRsO30KCnByaXZhdGU6CgogICAgaW50IGQ0Owp9OwoKaW50IG1haW4oKQp7CiAgICBCICpwQjsKICAgIHBCID0gbmV3IEQ0OwogICAgZHluYW1pY19jYXN0PEQ0Kj4ocEIpLT5mKDMpOwogICAgZGVsZXRlIHBCOwp9