#include <iostream>
class Example {
public :
Example( ) = default ;
virtual void virt_func( ) {
std:: cout << "Example virt_func" << std:: endl ;
}
void nonvirt_func( ) {
std:: cout << "Example nonvirt_func" << std:: endl ;
}
} ;
class Child: public Example {
public :
Child( ) = default ;
void virt_func( ) {
std:: cout << "Child virt_func" << std:: endl ;
}
void nonvirt_func( ) {
std:: cout << "Child nonvirt_func" << std:: endl ;
}
} ;
int main( ) {
Child c;
std:: cout << "On Child instance:" << std:: endl ;
c.virt_func ( ) ;
c.nonvirt_func ( ) ;
Example& e1 = c;
std:: cout << "\n On Example& casted from c:" << std:: endl ;
e1.virt_func ( ) ;
e1.nonvirt_func ( ) ;
Example e2 = c;
std:: cout << "\n On Example instance constructed from c:" << std:: endl ;
e2.virt_func ( ) ;
e2.nonvirt_func ( ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgRXhhbXBsZSB7CiAgICBwdWJsaWM6CiAgICAgICAgRXhhbXBsZSgpID0gZGVmYXVsdDsKICAgICAgICAKICAgICAgICB2aXJ0dWFsIHZvaWQgdmlydF9mdW5jKCkgeyAKICAgICAgICAJc3RkOjpjb3V0IDw8ICJFeGFtcGxlIHZpcnRfZnVuYyIgPDwgc3RkOjplbmRsOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB2b2lkIG5vbnZpcnRfZnVuYygpIHsKICAgICAgICAJc3RkOjpjb3V0IDw8ICJFeGFtcGxlIG5vbnZpcnRfZnVuYyIgPDwgc3RkOjplbmRsOyAKICAgICAgICB9Cn07CgpjbGFzcyBDaGlsZDogcHVibGljIEV4YW1wbGUgewogICAgcHVibGljOgogICAgCUNoaWxkKCkgPSBkZWZhdWx0OwogICAgCiAgICAgICAgdm9pZCB2aXJ0X2Z1bmMoKSB7CiAgICAgICAgCXN0ZDo6Y291dCA8PCAiQ2hpbGQgdmlydF9mdW5jIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZvaWQgbm9udmlydF9mdW5jKCkgewogICAgICAgIAlzdGQ6OmNvdXQgPDwgIkNoaWxkIG5vbnZpcnRfZnVuYyIgPDwgc3RkOjplbmRsOyAKICAgICAgICB9Cn07CgppbnQgbWFpbigpIHsKCUNoaWxkIGM7CglzdGQ6OmNvdXQgPDwgIk9uIENoaWxkIGluc3RhbmNlOiIgPDwgc3RkOjplbmRsOwoJYy52aXJ0X2Z1bmMoKTsKCWMubm9udmlydF9mdW5jKCk7CgkKCUV4YW1wbGUmIGUxID0gYzsKCXN0ZDo6Y291dCA8PCAiXG5PbiBFeGFtcGxlJiBjYXN0ZWQgZnJvbSBjOiIgPDwgc3RkOjplbmRsOwoJZTEudmlydF9mdW5jKCk7CgllMS5ub252aXJ0X2Z1bmMoKTsKCQoJRXhhbXBsZSBlMiA9IGM7CglzdGQ6OmNvdXQgPDwgIlxuT24gRXhhbXBsZSBpbnN0YW5jZSBjb25zdHJ1Y3RlZCBmcm9tIGM6IiA8PCBzdGQ6OmVuZGw7CgllMi52aXJ0X2Z1bmMoKTsKCWUyLm5vbnZpcnRfZnVuYygpOwp9