#include <iostream>
class A{
int var;
virtual void foo() = 0;
public:
void bar();
};
class B : public A{
public:
int var; // This is usually not a good practice (violates Liskov's principle)
void foo();
};
void A::bar(){
std::cout << var << std::endl; // This will output an uninitialized A var!
}
void B::foo(){
var = 42; // B's var hides A's var so this only sets the derived one's
}
void func(){
B myObj;
myObj.foo(); // No polymorphic behavior here, B::foo is called
myObj.bar(); // the same, but A::bar is called since B doesn't define one
}
class A2{
virtual void foo() = 0;
public:
int var;
void bar() {
std::cout << var;
}
};
class B2 : public A2{
public:
void foo() {
var = 42; // Sets the common A2::var variable
};
};
void func2(){
B2 myObj;
myObj.foo();
myObj.bar();
}
int main() {
func();
func2();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgQXsKCWludCB2YXI7Cgl2aXJ0dWFsIHZvaWQgZm9vKCkgPSAwOwpwdWJsaWM6Cgl2b2lkIGJhcigpOwp9OwoKY2xhc3MgQiA6IHB1YmxpYyBBewpwdWJsaWM6CglpbnQgdmFyOyAvLyBUaGlzIGlzIHVzdWFsbHkgbm90IGEgZ29vZCBwcmFjdGljZSAodmlvbGF0ZXMgTGlza292J3MgcHJpbmNpcGxlKQoJdm9pZCBmb28oKTsKfTsKCnZvaWQgQTo6YmFyKCl7CglzdGQ6OmNvdXQgPDwgdmFyIDw8IHN0ZDo6ZW5kbDsgLy8gVGhpcyB3aWxsIG91dHB1dCBhbiB1bmluaXRpYWxpemVkIEEgdmFyIQp9Cgp2b2lkIEI6OmZvbygpewoJdmFyID0gNDI7IC8vIEIncyB2YXIgaGlkZXMgQSdzIHZhciBzbyB0aGlzIG9ubHkgc2V0cyB0aGUgZGVyaXZlZCBvbmUncwp9Cgp2b2lkIGZ1bmMoKXsKCUIgbXlPYmo7CglteU9iai5mb28oKTsgLy8gTm8gcG9seW1vcnBoaWMgYmVoYXZpb3IgaGVyZSwgQjo6Zm9vIGlzIGNhbGxlZAoJbXlPYmouYmFyKCk7IC8vIHRoZSBzYW1lLCBidXQgQTo6YmFyIGlzIGNhbGxlZCBzaW5jZSBCIGRvZXNuJ3QgZGVmaW5lIG9uZQp9CgpjbGFzcyBBMnsKCXZpcnR1YWwgdm9pZCBmb28oKSA9IDA7CnB1YmxpYzoKCWludCB2YXI7Cgl2b2lkIGJhcigpIHsKCQlzdGQ6OmNvdXQgPDwgdmFyOwoJfQp9OwoKY2xhc3MgQjIgOiBwdWJsaWMgQTJ7CnB1YmxpYzoKCXZvaWQgZm9vKCkgewoJCXZhciA9IDQyOyAvLyBTZXRzIHRoZSBjb21tb24gQTI6OnZhciB2YXJpYWJsZQoJfTsKfTsKCnZvaWQgZnVuYzIoKXsKCUIyIG15T2JqOwoJbXlPYmouZm9vKCk7CglteU9iai5iYXIoKTsKfQoKaW50IG1haW4oKSB7CglmdW5jKCk7CglmdW5jMigpOwp9