//: C01:InitExcept.cpp {-bor}
// 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.
// Zpracuje výjimky v podobjektech
#include <iostream>
using namespace std;

class Zakladni {
  int i;
public:
  class ZakladniVyjimka {};
  Zakladni(int i) : i(i) { throw ZakladniVyjimka(); }
};

class Odvozena : public Zakladni {
public:
  class OdvozenaVyjimka {
    const char* msg;
  public:
    OdvozenaVyjimka(const char* msg) : msg(msg) {}
    const char* what() const { return msg; }
  };
  Odvozena(int j) try : Zakladni(j) {
    // tělo konstruktoru
    cout << "toto se nevytiskne" << endl;
  } catch(ZakladniVyjimka&) {
    throw OdvozenaVyjimka("vyvolana podobjektem Zakladni");;
  }
};

int main() {
  try {
    Odvozena d(3);
  } catch(Odvozena::OdvozenaVyjimka& d) {
    cout << d.what() << endl;  // "vyvolana podobjektem Zakladni"
  }
} ///:~
