#include <iostream>
struct Base {
virtual void sayHi() {
std::cout << "Hi from Base!\n";
}
virtual ~Base() {}
};
struct Derived : Base {
virtual void sayHi() {
std::cout << "Hi from Derived!\n";
}
};
void sayHelloToMyValue(Base o) {
o.sayHi();
}
void sayHelloToMyReference(Base &o) {
o.sayHi();
}
void sayHelloToMyPointer(Base *o) {
o->sayHi();
}
int main(int, char**) {
Derived d; // No dynamic allocation!
Base &base = d;
sayHelloToMyValue(base);
sayHelloToMyReference(base);
sayHelloToMyPointer(&base);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgpzdHJ1Y3QgQmFzZSB7Cgl2aXJ0dWFsIHZvaWQgc2F5SGkoKSB7CgkJc3RkOjpjb3V0IDw8ICJIaSBmcm9tIEJhc2UhXG4iOwoJfQoJCgl2aXJ0dWFsIH5CYXNlKCkge30KfTsKCnN0cnVjdCBEZXJpdmVkIDogQmFzZSB7Cgl2aXJ0dWFsIHZvaWQgc2F5SGkoKSB7CgkJc3RkOjpjb3V0IDw8ICJIaSBmcm9tIERlcml2ZWQhXG4iOwoJfQp9OwoKdm9pZCBzYXlIZWxsb1RvTXlWYWx1ZShCYXNlIG8pIHsKCW8uc2F5SGkoKTsKfQoKdm9pZCBzYXlIZWxsb1RvTXlSZWZlcmVuY2UoQmFzZSAmbykgewoJby5zYXlIaSgpOwp9Cgp2b2lkIHNheUhlbGxvVG9NeVBvaW50ZXIoQmFzZSAqbykgewoJby0+c2F5SGkoKTsKfQoKaW50IG1haW4oaW50LCBjaGFyKiopIHsKCURlcml2ZWQgZDsJLy8gTm8gZHluYW1pYyBhbGxvY2F0aW9uIQoJQmFzZSAmYmFzZSA9IGQ7CgkKCXNheUhlbGxvVG9NeVZhbHVlKGJhc2UpOwoJc2F5SGVsbG9Ub015UmVmZXJlbmNlKGJhc2UpOwoJc2F5SGVsbG9Ub015UG9pbnRlcigmYmFzZSk7CgkKCXJldHVybiAwOwp9