//: C09:Paste.cpp
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
//{L} Vendor
// Oprava zmatku pomocí VD.
#include <iostream>
#include "Vendor.h"
using namespace std;

class MyBase { // Oprava dodaného rozhraní 
public:
  virtual void v() const = 0;
  virtual void f() const = 0;
  // Funkce nového rozhraní:
  virtual void g() const = 0;
  virtual ~MyBase() { cout << "~MyBase()" << endl; }
};

class Slepana1 : public MyBase, public Vendor1 {
public:
  void v() const {
    cout << "Slepana1::v()" << endl;
    Vendor1::v();
  }
  void f() const {
    cout << "Slepana1::f()" << endl;
    Vendor1::f();
  }
  void g() const { cout << "Slepana1::g()" << endl; }
  ~Slepana1() { cout << "~Slepana1()" << endl; }
};

int main() {
  Slepana1& p1p = *new Slepana1;
  MyBase& mp = p1p; // Přetypování směrem nahoru
  cout << "volání f()" << endl;
  mp.f();  // Správné chování
  cout << "volání g()" << endl;
  mp.g(); // Nové chování
  cout << "volání A(p1p)" << endl;
  A(p1p); // Staré chování zůstalo
  cout << "volání B(p1p)" << endl;
  B(p1p);  // Staré chování zůstalo
  cout << "delete mp" << endl;
  // Smazání odkazu na objekt hromady:
  delete &mp; // Správné chování
} ///:~
