#include <iostream>
using namespace std;
struct A {
virtual void f(int a=1) = 0;
};
struct B:A {
void f(int a) override ;
};
struct C:A {
void f(int a=2) override ;
};
void B::f(int a) // definition
{
cout<<"B"<<a<<endl;
}
void C::f(int a) // definition
{
cout<<"C"<<a<<endl;
}
int main() {
B b;
C c;
A *x=&c, *y=&b; // points to the same objects but using a polymorphic pointer
x->f(); // default value defined for A::f() but with the implementation of C ==> C1
y->f(); // default value defined for A::f() but with the implementation of B ==> B1
// b.f(); // default not defined for B::f();
c.f(); // default value defined for C::f(); ==> C2
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEEgewoJdmlydHVhbCB2b2lkIGYoaW50IGE9MSkgPSAwOyAgICAKfTsKc3RydWN0IEI6QSB7Cgl2b2lkIGYoaW50IGEpIG92ZXJyaWRlIDsgICAgIAp9OwpzdHJ1Y3QgQzpBIHsKCXZvaWQgZihpbnQgYT0yKSBvdmVycmlkZSA7ICAgICAKfTsKdm9pZCBCOjpmKGludCBhKSAgICAgICAgLy8gZGVmaW5pdGlvbiAKewoJY291dDw8IkIiPDxhPDxlbmRsOyAKfQp2b2lkIEM6OmYoaW50IGEpICAgICAgICAvLyBkZWZpbml0aW9uIAp7Cgljb3V0PDwiQyI8PGE8PGVuZGw7IAp9CmludCBtYWluKCkgewoJQiBiOyAKCUMgYzsgCglBICp4PSZjLCAqeT0mYjsgICAgLy8gcG9pbnRzIHRvIHRoZSBzYW1lIG9iamVjdHMgYnV0IHVzaW5nIGEgcG9seW1vcnBoaWMgcG9pbnRlcgoJeC0+ZigpOyAgLy8gZGVmYXVsdCB2YWx1ZSBkZWZpbmVkIGZvciBBOjpmKCkgYnV0IHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIEMgPT0+IEMxICAgCgl5LT5mKCk7ICAvLyBkZWZhdWx0IHZhbHVlIGRlZmluZWQgZm9yIEE6OmYoKSBidXQgd2l0aCB0aGUgaW1wbGVtZW50YXRpb24gb2YgQiA9PT4gQjEKLy8JYi5mKCk7ICAvLyBkZWZhdWx0IG5vdCBkZWZpbmVkIGZvciBCOjpmKCk7ICAgCgljLmYoKTsgIC8vIGRlZmF1bHQgdmFsdWUgZGVmaW5lZCBmb3IgQzo6ZigpOyA9PT4gQzIKCXJldHVybiAwOwp9