2010-04-03 16 views
10

dieser Beispielcode Gegeben:C++ Ausnahmen und Vererbung von std :: exception

#include <iostream> 
#include <stdexcept> 

class my_exception_t : std::exception 
{ 
public: 
    explicit my_exception_t() 
    { } 

    virtual const char* what() const throw() 
    { return "Hello, world!"; } 
}; 

int main() 
{ 
    try 
     { throw my_exception_t(); } 
    catch (const std::exception& error) 
     { std::cerr << "Exception: " << error.what() << std::endl; } 
    catch (...) 
     { std::cerr << "Exception: unknown" << std::endl; } 

    return 0; 
} 

ich folgende Ausgabe:

Exception: unknown 

doch einfach das Erbe my_exception_t von std::exceptionpublic machen, ich die folgende Ausgabe:

Exception: Hello, world! 

Könnte jemand pl erklären Sie mir einfach, warum die Art der Erbschaft in diesem Fall wichtig ist? Bonuspunkte für eine Referenz im Standard.

Antwort

20

ist, hat Wenn Sie privat erben, können Sie nicht konvertieren oder auf andere Weise, dass die Basisklasse zugreifen außerhalb der Klasse.

§11.2/4: Da Sie etwas von der Norm gefragt
ist eine Basisklasse gesagt zugänglich sein, wenn ein erfundenes öffentliches Mitglied der Basisklasse zugänglich ist. Wenn auf eine Basisklasse zugegriffen werden kann, kann implizit ein Zeiger in eine abgeleitete Klasse in einen Zeiger auf diese Basisklasse (4.10, 4.11) konvertiert werden.

Einfach gesagt, zu allem außerhalb der Klasse ist es, als ob Sie nie von std::exception geerbt haben, weil es privat ist. Ergo, es wird nicht in der std::exception& Klausel gefangen werden, da keine Konvertierung existiert.

+0

Akzeptiert für die Standardreferenz; Vielen Dank! – fbrereto

9

Könnte jemand mir bitte erklären, warum die Art der Erbschaftsangelegenheiten in diesem Fall? Bonuspunkte für eine Referenz im Standard.

Die Art der Vererbung spielt keine Rolle. Es kommt nur darauf an, dass für eine der Fangarten eine zugängliche Konvertierung verfügbar ist. Da es sich nicht um eine öffentliche Vererbung handelt, gibt es keine öffentlich zugängliche Konvertierung.


Erläuterung:

Sie das gleiche Verhalten hier sehen können:

class B 
{ 
}; 

class C1 : B 
{ 
}; 

class C2 : public B 
{ 
}; 

int main(int argc, char** argv) 
{ 
    B& b1 = C1();//Compiling error due to conversion exists but is inaccessible 
    B& b2 = C2();//OK 
    return 0; 
} 

A geworfen Ausnahme nur durch einen catch-Block abgefangen wird, wenn:

  1. Der Fang Block hat einen passenden Typ oder
  2. Der catch-Block ist für einen Typ, der eine zugänglich Umwandlung
  3. Der catch-Block ein catch (...)
+0

'my_exception_t' leitet sich in beiden Fällen von' std :: exception' ab. – fbrereto

+0

@fbrereto: Danke für die Klarstellung, erklärte ich in meiner Antwort noch einmal. –

Verwandte Themen