Frage

Es ist nicht klar, was passiert, wenn ich eine virtuelle Methode in C ++ 0x löschen:

 virtual int derive_func() = delete;

Bedeutet dies, diese Klasse und alles, was erbt von nicht definieren kann / implementieren die derive_func() Methode? Oder ist dies illegal / Compiler-Fehler?

War es hilfreich?

Lösung

http: // www. open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2326.html#delete A deleted virtual function may not override a non-deleted virtual function and vice-versa. seine ziemlich nutzlos Sinn (wie ich es zumindest lesen) die einzig gültige Verwendung wäre:

struct A{
     virtual void b() = delete;
};
struct B:A{
     virtual void b() = delete;
};

, die völlig nutzlos ist, da die Funktion nicht aufgerufen werden kann. für nicht virtuelle Funktionen ist die Verwendung mehr gerechtfertigt

EDIT ganz klar, dass dies die einzig mögliche Beziehung zu sein, Kinder nicht implementieren kann, und Sie können nicht eine nicht gelöschte geerbten virtuellen löschen.

Andere Tipps

flownt es richtig , aber ich möchte darauf hinweisen, dass in der letzten C ++ 11 Entwurf (N3337) hat die entsprechende Sprache 10.3 # 16 Abschnitt bewegt:

  

Eine Funktion mit einer gelöschten Definition darf keine Funktion außer Kraft setzen   das nicht eine gelöschte Definition hat. Ebenso ist eine Funktion, dass   keine gelöschte Definition haben, ist nicht eine Funktion außer Kraft setzen mit   eine gelöschte Definition. 2

Es scheint ziemlich klar ich (Abschnitt 8.4.3 # 1), dass eine gelöscht Definition in der Tat Zählung als Definition , und in der Tat eine Inline-Definition, was bedeutet, eine gelöschte Definition erfüllt 10,3 # 11:

  

Eine virtuelle Funktion in einer Klasse deklariert werden definiert oder erklärt   rein in dieser Klasse, oder beides; aber keine Diagnose erforderlich ist. 2

Allerdings scheint es, dass die aktuellen Implementierungen nicht einverstanden sind. Hier ist mein Testfall:

struct Base {
    virtual void bar();
    virtual void foo() = delete;
};

void Base::bar() { }  // a definition of the first non-inline virtual function
int main() { Base b; }
  • Clang erzeugt ein unlinkable Programm: Base::foo in der VTable für Base erwähnt. Und wenn Sie die Reihenfolge der foo und bar tauschen, beschwert sich der Linker, dass die gesamte VTable fehlt (weil Clang denkt foo ist eine Nicht-Inline-Funktion ohne Definition). Ich legte dies als Fehler ; wir werden sehen, was die Entwickler denken.

  • klagt GCC über eine „Verwendung“ von foo am Ende der Übersetzungseinheit, wenn sie die VTable schaffen; aber es funktioniert richtig bar als erste nicht-Inline virtuelle Member-Funktion identifizieren, unabhängig von der Reihenfolge der foo und bar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top