#include class A { public: void a() { printf("A::a()\n");}; virtual void va() = 0; virtual void a(int n) { printf("A::a(int %d)\n", n); }; private: void c() { printf("A::c()\n");}; }; class B : public A { public: using A::a; void b() { printf("B::b()\n");}; virtual void vb() {printf("B::vb()\n"); }; void a(double d) {printf("B::a(double %f)\n", d); }; void a(int i) {printf("B::a(int %d)\n", i); }; virtual void va() {printf("B::va()\n"); }; B operator+(int n); friend B operator+(int n, B& b); }; B B::operator+(int n) { return *this; } B operator+(int n, B& b) { return b + n; } class C : public B { public: virtual void c() {printf("C::c()\n"); }; void a(float d) {printf("C::a(float %f)\n", d); }; virtual void a() {printf("C::a()\n"); }; virtual void va() {printf("C::va()\n"); }; }; int main() { // A a; A abstrakte Klasse B b; B b2; C c; A* pa=&b; B* pb=&c; float x = 1.2; pa->a(); // A::a() pa->va(); // B::va() pa->a(1); // B::a(int) // pa->c(); A::c() private, hier nicht sichtbar // pa->b(); pa ist vom Typ A* und kennt deswegen b() nicht // pa->vb(); pa ist vom Typ A* und kennt deswegen vb() nicht pa->a(x); // B::a(int), hier wird double x implizit zu int gecastet pb->a(); //pb ist vom Typ B*, hier ist A::a() überladen durch // entweder B::a(double) bzw. B::a(int), deswegen existiert B::a() nicht pb->va(); // C::va() pb->a(1); // B::a(int) // pb->c(); A::c() private, deswegen hier nicht sichtbar pb->b(); // B::b() pb->vb(); // B::vb() pb->a(x); // B::a(double) pa = &c; pa->a(); // A::a() pa->va(); // C::va() pa->a(1); // B::a(int) // pa->c(); A::c() private, hier nicht sichtbar // pa->b(); pa ist vom Typ A*, kennt deswegen b() nicht // pa->vb(); pa ist vom Typ A*, kennt deswegen vb() nicht pa->a(x); // B::a(int), hier wird double x implizit zu int gecastet }