//: C09:AmbiguousName.cpp {-xo} class Top { public: virtual ~Top() {} }; class Left : virtual public Top { public: void f() {} }; class Right : virtual public Top { public: void f() {} }; class Bottom : public Left, public Right {}; int main() { Bottom b; b.f(); // Error here } ///:~
Listado 8.16. C09/AmbiguousName.cpp
//: C09:BreakTie.cpp class Top { public: virtual ~Top() {} }; class Left : virtual public Top { public: void f() {} }; class Right : virtual public Top { public: void f() {} }; class Bottom : public Left, public Right { public: using Left::f; }; int main() { Bottom b; b.f(); // Calls Left::f() } ///:~
Listado 8.17. C09/BreakTie.cpp
//: C09:Dominance.cpp class Top { public: virtual ~Top() {} virtual void f() {} }; class Left : virtual public Top { public: void f() {} }; class Right : virtual public Top {}; class Bottom : public Left, public Right {}; int main() { Bottom b; b.f(); // Calls Left::f() } ///:~
Listado 8.18. C09/Dominance.cpp
//: C09:Dominance2.cpp #include <iostream> using namespace std; class A { public: virtual ~A() {} virtual void f() { cout << "A::f\n"; } }; class B : virtual public A { public: void f() { cout << "B::f\n"; } }; class C : public B {}; class D : public C, virtual public A {}; int main() { B* p = new D; p->f(); // Calls B::f() delete p; } ///:~
Listado 8.19. C09/Dominance2.cpp