Untergeordnete Methode von der Basismethode ohne virtuelle oder Referenzen aufrufen

8

Betrachten Sie den Code:

%Vor%

Wenn ich A::g() virtual mache, gibt es "Call from B" aus.

Ich verstand immer "virtuell" nützlich, wenn wir wollen, dass eine Schnittstelle Polymorphie erlaubt, sagen wir A *a = new B(); a->f() , aber dieses Beispiel zeigt an, dass virtual auch in dieser Situation benötigt wird. Mein Verständnis dieses Beispiels ist, dass der Aufruf g() auf A::f formell äquivalent zu this->g() ist, und dies ist ein Zeiger.

Allerdings wollte ich das nicht wirklich: In meinem Beispiel habe ich eine allgemeine Template-Klasse A mit einer allgemeinen Methode A::simulate (zB A::f ), die verschiedene Methoden verwendet (zB A::g() ), einige davon werden durch die Unterklasse überschrieben (zB B ). Was ich wollte, war, die Methode A::simulate so zu haben, dass der Code in den Unterklassen von A so kompiliert würde, als wäre er in den Unterklassen definiert worden, so dass ich nicht dieselbe mehrfache Logik habe. Wie kann ich das tun?

Dies liegt daran, dass meine Schnittstelle keinen Polymorphismus erfordert, da der Benutzer den Code immer kompilieren muss (d. h. nur Header).

    
Jorge Leitão 01.07.2015, 16:34
quelle

1 Antwort

11

Sie können Ihre Basisklasse einfach zu einem CRTP machen (wie Sie bereits erwähnt haben, ist es ohnehin eine Template-Klasse):

%Vor%     
πάντα ῥεῖ 01.07.2015, 16:45
quelle

Tags und Links