Bitte führen Sie mich, warum die b_ptr- & gt; foo () nicht die Funktion foo () der Klasse b aufrufen?
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%).
Mehrere Dinge:
foo()
und nicht foo(void)
... Letzteres ist unnötig und nicht idiomatisch C ++ (es ist C-ähnliche Syntax). class
in a* b_ptr = new b;
, da der Typ des Typs bereits deklariert wurde. return 0
). b_ptr
frei. Es wäre besser, std::auto_ptr<a> b_ptr(new b);
zu schreiben. 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. b*
oder make a::foo
public, um es so zu verwenden, wie Sie es wünschen.
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.
Tags und Links c++