class A { public: void a() { }; virtual void va() = 0; virtual void a(int n); private: void c() { }; }; class B : public A { public: void b() { }; virtual void vb(); void a(double d) { }; void a(int i) { }; virtual void va(); }; class C : public B { public: virtual void c(); void a(float) { }; virtual void a(); virtual void va(); }; int main() { // A a; A abstrakte Klasse B b; C c; A* pa=&b; B* pb=&c; float x = 1.2; pa->a(); pa->va(); pa->a(1); // 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); // pb->a(); pb ist vom Typ B*, hier ist A::a() überladen durch // entweder B::a(double) bzw. B::a(int) nicht durch B::a() pb->va(); pb->a(1); // pb->c(); A::c() private, deswegen hier nicht sichtbar pb->b(); pb->vb(); pb->a(x); pa = &c; pa->a(); pa->va(); pa->a(1); // 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); }