#include <iostream>
class Example {
private:
int a;
// lots of important variables that live on the heap
public:
int getA() { return a; }
Example(Example& other) {
std::cout << "Example copy constructor" << std::endl;
a = other.a;
}
Example(int a_local) {
a = a_local;
std::cout << "Example constructor" << std::endl;
/* allocating memory, etc. ... */
}
};
class Child: public Example {
// we get `a` and `getA()` from example
private:
int b;
public:
Child(int a2, int b2) : Example(a2) {
std::cout << "Child constructor" << std::endl;
b = b2;
}
int getB() { return b; }
int getAplusB() { return getA() + b; } // we can't use `a` directly since it's private
};
int main() {
Child c(1, 5);
std::cout << c.getA() << std::endl;
std::cout << c.getB() << std::endl;
std::cout << c.getAplusB() << "\n" << std::endl;
Example& e = dynamic_cast<Example&>(c);
// Example& e = c;
// Example e = c;
std::cout << e.getA() << "\n" << std::endl;
// Example e2(10);
// Child c2 = dynamic_cast<Child&>(e2);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgRXhhbXBsZSB7CiAgICBwcml2YXRlOgogICAgICAgIGludCBhOwogICAgICAgIC8vIGxvdHMgb2YgaW1wb3J0YW50IHZhcmlhYmxlcyB0aGF0IGxpdmUgb24gdGhlIGhlYXAKICAgIHB1YmxpYzoKICAgICAgICBpbnQgZ2V0QSgpIHsgcmV0dXJuIGE7IH0KICAgICAgICAKICAgICAgICBFeGFtcGxlKEV4YW1wbGUmIG90aGVyKSB7CiAgICAgICAgCXN0ZDo6Y291dCA8PCAiRXhhbXBsZSBjb3B5IGNvbnN0cnVjdG9yIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgCWEgPSBvdGhlci5hOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBFeGFtcGxlKGludCBhX2xvY2FsKSB7CiAgICAgICAgICAgIGEgPSBhX2xvY2FsOwogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkV4YW1wbGUgY29uc3RydWN0b3IiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgLyogYWxsb2NhdGluZyBtZW1vcnksIGV0Yy4gLi4uICovCiAgICAgICAgfQp9OwoKY2xhc3MgQ2hpbGQ6IHB1YmxpYyBFeGFtcGxlIHsKICAgIC8vIHdlIGdldCBgYWAgYW5kIGBnZXRBKClgIGZyb20gZXhhbXBsZQogICAgcHJpdmF0ZToKICAgICAgICBpbnQgYjsKICAgIHB1YmxpYzoKICAgIAlDaGlsZChpbnQgYTIsIGludCBiMikgOiBFeGFtcGxlKGEyKSB7CiAgICAJCXN0ZDo6Y291dCA8PCAiQ2hpbGQgY29uc3RydWN0b3IiIDw8IHN0ZDo6ZW5kbDsKICAgIAkJYiA9IGIyOwogICAgCX0KICAgIAogICAgICAgIGludCBnZXRCKCkgeyByZXR1cm4gYjsgfQogICAgICAgIGludCBnZXRBcGx1c0IoKSB7IHJldHVybiBnZXRBKCkgKyBiOyB9IC8vIHdlIGNhbid0IHVzZSBgYWAgZGlyZWN0bHkgc2luY2UgaXQncyBwcml2YXRlCn07CgppbnQgbWFpbigpIHsKCUNoaWxkIGMoMSwgNSk7CglzdGQ6OmNvdXQgPDwgYy5nZXRBKCkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGMuZ2V0QigpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBjLmdldEFwbHVzQigpIDw8ICJcbiIgPDwgc3RkOjplbmRsOwoJCglFeGFtcGxlJiBlID0gZHluYW1pY19jYXN0PEV4YW1wbGUmPihjKTsKCS8vIEV4YW1wbGUmIGUgPSBjOwoJLy8gRXhhbXBsZSBlID0gYzsKCXN0ZDo6Y291dCA8PCBlLmdldEEoKSA8PCAiXG4iIDw8IHN0ZDo6ZW5kbDsKCQoJLy8gRXhhbXBsZSBlMigxMCk7CgkvLyBDaGlsZCBjMiA9IGR5bmFtaWNfY2FzdDxDaGlsZCY+KGUyKTsKfQ==