Ich verstehe, warum Sie nicht einfach einen abgeleiteten Klassenmitgliedsfunktionszeiger auf Basisfunktionszeiger des Basismitglieds wie erläutert here umwandeln können.Übergeben abgeleitete virtuelle Überschreibung, um reines virtuelles Mitglied zu basieren
Aber angesichts dieser Ausschnitt:
struct base
{
virtual void foo() = 0;
};
struct derived : base
{
void foo() override {};
};
struct invoker
{
typedef void(base::*target)();
invoker(base* b, target t)
{
(b->*t)();
}
};
template<typename B, typename D>
void (B::*cast(void (D::*method)()))()
{
return static_cast<void(B::*)()>(method);
}
derived d;
invoker bad(&d, &derived::foo); //C2664
invoker good(&d, cast<base>(&derived::foo));
ich fragen wollte, ist es möglich, die Basisfunktion Unterschrift zu dekorieren, so dass Compiler es versteht, ist eine rein virtuelle Methode und, und es wird irgendwo in der Hierarchie implementiert werden (sonst könnte ich kein Objekt vom Typ B
konstruieren)? Ich verstehe, warum ich das mit normalen Funktionen nicht tun kann, aber IMHO im Falle einer reinen virtuellen Funktion hat der Compiler eine Garantie, dass es implementiert wird (falls es nicht gemacht wurde, würde ich einen Fehler über die Klasse B
nicht über die Besetzung).
Es ist unklar, um welche Art von Dekoration es sich handelt. Wenn Sie ein oberster Leiter des C++ - Design-Komitees wären, was würden Sie tun? Machen Sie sich keine Gedanken über Konsistenz oder Korrektheit, zeigen Sie einfach, was Sie zu C++ hinzufügen möchten. Wenn Sie dem Compiler nur mitteilen wollen, dass 'derived :: foo 'in' base' existiert, können Sie einfach '& base :: foo' schreiben. –
@ n.m. Ich möchte es vermeiden, die explizite Besetzung zu machen: D Aber es war eher eine Art "Frage, ob ich mich nicht bewusst bin". –
Nein, nicht einen Wurf machen. Beginnen Sie einfach mit '& base :: foo'. Was macht '& abgeleitete :: foo', was' & base :: foo' nicht kann? –