Ich finde das seltsam. Im ct von Sample_Base rufe ich bar() auf, das intern fun() aufruft, was eine rein virtuelle Funktion ist. Ich bekomme den Fehler "reine virtuelle Funktion" genannt. Was ist in Ordnung. Jetzt, wenn ich fun() direkt von Sample_Bases ctor aufrufen, bekomme ich diesen Fehler nicht. Ich habe es auf VC++ 2010 Beta 2 und auf g ++ 4.4.1 auf Ubuntu 9.10 versucht. Ich stimme zu, dass eine Implementierung für reine virtuelle Funktionen, die keine reinen virtuellen Destruktoren sind, bedeutungslos ist. Aber ich bin ein wenig überrascht über dieses Verhalten.Pure Virtual Function namens Fehler
class Sample_Base
{
public:
Sample_Base()
{
bar();
// fun();
}
/* This is code does not throw any error.
Sample_Base()
{
fun();
}
*/
void bar()
{
fun();
}
virtual void fun() = 0;
virtual ~Sample_Base();
};
Sample_Base::~Sample_Base()
{
}
void Sample_Base::fun()
{
std::cout << "Sample_Base::fun\n";
}
class Sample_Derived : public Sample_Base
{
public:
Sample_Derived() : Sample_Base()
{
fun();
}
void fun()
{
std::cout << "Sample_Derived::fun\n";
}
~Sample_Derived()
{
}
};
Die [C++ Standard] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf) §10.4.6 besagt, dass "ein virtueller Aufruf an eine reine virtuelle Funktion ... für das zu erstellende Objekt ... ist undefiniert ". Können Sie das kommentieren? Ich würde es lesen, dass das Aufrufen von 'fun' direkt auch undefiniert sein sollte (selbst wenn der Compiler in diesem speziellen Fall kein abstürzendes Programm erzeugt). Oder ist es ein virtueller Aufruf in diesem Kontext (wenn, warum, ich konnte es nicht im Standard finden). – Xlea
@Xlea Charles Bailey weist Sie in seiner Antwort auf die richtigen Abschnitte des Standards hin. Wohlgemerkt, er hat damals den C++ 03-Standard verwendet, so dass die Abschnittsnummern jetzt anders sind, aber das könnte Sie leiten. – Gorpik