Virtuelle Funktion

7
%Vor%

Bitte führen Sie mich, warum die b_ptr- & gt; foo () nicht die Funktion foo () der Klasse b aufrufen?

    
user296113 18.03.2010, 00:49
quelle

4 Antworten

17

Da Sie den Code geschrieben haben, wird er aufgrund von Zugriffskontrollverletzungen nicht kompiliert. Da b_ptr tatsächlich vom Typ a * ist und a::foo privat ist, wird der Compiler das nicht zulassen.

Aber make a::foo public und das wird korrekt b::foo aufrufen.

Es gibt auch das Problem, dass Sie a::foo nicht definiert haben, damit Ihr Programm nicht verlinkt wird. Sie müssen es entweder definieren oder rein virtuell machen (d. H.% Co_de%).

    
R Samuel Klatchko 18.03.2010 00:54
quelle
3

Weil a: foo () nicht öffentlich ist.

    
shf301 18.03.2010 00:55
quelle
0

Mehrere Dinge:

  1. Schreibe foo() und nicht foo(void) ... Letzteres ist unnötig und nicht idiomatisch C ++ (es ist C-ähnliche Syntax).
  2.    
  3. Schreiben Sie nicht class in a* b_ptr = new b; , da der Typ des Typs bereits deklariert wurde.
  4.    
  5. Sie sollten von einer Funktion zurückkehren, die nicht void zurückgibt (add return 0 ).
  6.    
  7. Dein Code gibt niemals b_ptr frei. Es wäre besser, std::auto_ptr<a> b_ptr(new b); zu schreiben.
  8.    
  9. Der Kompilierzeittyp (deklarierter Typ) von b_ptr ist a* , während der Laufzeittyp (Instanziierungs- / Zuordnungstyp) b* ist. Der Compiler (und das Typsystem) kennen nur die Kompilierzeittypen, und so werden Zugriffsberechtigungen basierend auf dem Typ der Kompilierzeit durchgeführt ... daher ist b_ptr->foo() nicht erlaubt.
  10.    
  11. Entweder verwenden Sie einen deklarierten Typ von b* oder make a::foo public, um es so zu verwenden, wie Sie es wünschen.
Michael Aaron Safyan 18.03.2010 01:05
quelle
-1

Mach das

%Vor%

Sie können eine private Funktion nicht überschreiben. Obwohl ich nicht sicher bin, wie Sie b_ptr->foo() anyways aufrufen konnten, da a::foo privat ist.

    
John Kugelman 18.03.2010 00:53
quelle

Tags und Links