//: C09:Vendor.h // Vendor-supplied class header // You only get this & the compiled Vendor.obj. #ifndef VENDOR_H #define VENDOR_H class Vendor { public: virtual void v() const; void f() const; // Might want this to be virtual... ~Vendor(); // Oops! Not virtual! }; class Vendor1 : public Vendor { public: void v() const; void f() const; ~Vendor1(); }; void A(const Vendor&); void B(const Vendor&); // Etc. #endif // VENDOR_H ///:~
Listado 8.20. C09/Vendor.h
//: C09:Vendor.cpp {O} // Assume this is compiled and unavailable to you. #include "Vendor.h" #include <iostream> using namespace std; void Vendor::v() const { cout << "Vendor::v()" << endl; } void Vendor::f() const { cout << "Vendor::f()" << endl; } Vendor::~Vendor() { cout << "~Vendor()" << endl; } void Vendor1::v() const { cout << "Vendor1::v()" << endl; } void Vendor1::f() const { cout << "Vendor1::f()" << endl; } Vendor1::~Vendor1() { cout << "~Vendor1()" << endl; } void A(const Vendor& v) { // ... v.v(); v.f(); // ... } void B(const Vendor& v) { // ... v.v(); v.f(); // ... } ///:~
Listado 8.21. C09/Vendor.cpp
//: C09:Paste.cpp //{L} Vendor // Fixing a mess with MI. #include <iostream> #include "Vendor.h" using namespace std; class MyBase { // Repair Vendor interface public: virtual void v() const = 0; virtual void f() const = 0; // New interface function: virtual void g() const = 0; virtual ~MyBase() { cout << "~MyBase()" << endl; } }; class Paste1 : public MyBase, public Vendor1 { public: void v() const { cout << "Paste1::v()" << endl; Vendor1::v(); } void f() const { cout << "Paste1::f()" << endl; Vendor1::f(); } void g() const { cout << "Paste1::g()" << endl; } ~Paste1() { cout << "~Paste1()" << endl; } }; int main() { Paste1& p1p = *new Paste1; MyBase& mp = p1p; // Upcast cout << "calling f()" << endl; mp.f(); // Right behavior cout << "calling g()" << endl; mp.g(); // New behavior cout << "calling A(p1p)" << endl; A(p1p); // Same old behavior cout << "calling B(p1p)" << endl; B(p1p); // Same old behavior cout << "delete mp" << endl; // Deleting a reference to a heap object: delete ∓ // Right behavior } ///:~
Listado 8.22. C09/Paste.cpp
MyBase* mp = p1p; // Upcast
calling f() Paste1::f() Vendor1::f() calling g() Paste1::g() calling A(p1p) Paste1::v() Vendor1::v() Vendor::f() calling B(p1p) Paste1::v() Vendor1::v() Vendor::f() delete mp ~Paste1() ~Vendor1() ~Vendor() ~MyBase()