Können Sie überschreiben privaten definierten Funktionen in einer Basis-Klasse?
Glaube ich, eine derived class
können override
nur diejenigen Funktionen, die das Erbe der base class
. Ist mein Verständnis korrekt.?
Ist, wenn die Basisklasse hat eine öffentliche member-Funktion sagen, func
, dann die abgeleitete Klasse kann override
die member-Funktion func
.
Aber wenn die Basis-Klasse hat ein private-member-Funktion sagen, foo
, dann der der abgeleiteten Klasse nicht überschrieben werden können die member-Funktion foo
.
Habe ich Recht?
Bearbeiten
Habe ich kommen mit einem code-Beispiel nach dem Studium der Antworten, SO die Mitglieder. Ich erwähne die Punkte, die ich untersucht, wie die Kommentare im code. Hoffe, dass ich rechts bin. Dank
/* Points to ponder:
1. Irrespective of the access specifier, the member functions can be override in base class.
But we cannot directly access the overriden function. It has to be invoked using a public
member function of base class.
2. A base class pointer holding the derived class obj's address can access only those members which
the derived class inherited from the base class. */
#include <iostream>
using namespace std;
class base
{
private:
virtual void do_op()
{
cout << "This is do_op() in base which is pvt\n";
}
public:
void op()
{
do_op();
}
};
class derived: public base
{
public:
void do_op()
{
cout << "This is do_op() in derived class\n";
}
};
int main()
{
base *bptr;
derived d;
bptr = &d;
bptr->op(); /* Invoking the overriden do_op() of derived class through the public
function op() of base class */
//bptr->do_op(); /* Error. bptr trying to access a member function which derived class
did not inherit from base class */
return 0;
}
InformationsquelleAutor nitin_cherian | 2011-11-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die override-Funktionen unabhängig von der Zugriffsbezeichner. Das ist auch das Herzstück der nicht-virtuelle Schnittstelle idiom. Die einzige Voraussetzung ist natürlich, dass Sie
virtual
.InformationsquelleAutor Xeo
In Java, das können Sie nicht. In C++ können Sie.
Nein, es ist nur so, dass viele Java-Programmierer sind überrascht, wenn Sie Ihnen sagen, Sie überschreiben können private Methoden in C++.
Vielen Dank für die Angebotserstellung von meiner Frage und dann beantwortet.
InformationsquelleAutor fredoverflow
Sind Sie richtig, dass das überschreiben einer Funktion in einer abgeleiteten Klasse, es muss Erben von der Basisklasse (zusätzlich, die Funktion der Basisklasse sein muss virtuell). Allerdings sind Sie falsch über Ihre Annahme, dass virtuelle Funktionen werden nicht vererbt. Zum Beispiel, die folgenden gut funktioniert (und ist eigentlich eine bekannte Redewendung für precondition/postcondition-Prüfung):
Einen Weg, um zu sehen, dass private Methoden sind wirklich vererbt ist, zu schauen die Fehlermeldungen mit dem folgenden code erzeugt:
Versuchen, kompilieren Sie diese mit g++ tot führt er folgende Fehlermeldungen:
Wenn die Abgeleitete Klasse würde nicht Erben, die Funktion, die Fehlermeldung wäre in beiden Fällen gleich.
do_operate_on
was ist ein private member in der Basisklasse wird überschrieben in der abgeleiteten Klasse. So, da der private member werden nicht vererbt, das obige Beispiel zeigt, dass Funktionen können weiterhin überschrieben werden, obwohl Sie nicht vererbt werden. Deine Antwort verwirrt mich ein wenig, weilBjörn Pollex
undFredOverflow
denkt anders als Sie. Sie sagen, die privaten virtuellen Funktionen überschrieben werden können+1 für das Codebeispiel, das eröffnet Geist der privaten Nutzung von virtuellen member-Funktion.
Ich habe jetzt Hinzugefügt, Beispiel-code zeigen, dass die privat-Funktion wird in der Tat vererbt.
Bitte klären Sie. Setzen Sie einen Strich für das "da FredOverflow so gesagt"
InformationsquelleAutor celtschk
Nein, Sie können nicht mehr fahren, jede Funktion ist in der base-Klasse .
Mein Grund für diese Idee ist, dass, wenn Sie die Definition der Funktion in der abgeleiteten Klasse, die hat die gleiche Funktion Signatur in der Basis-Klasse , die Funktion der Basisklasse wird versteckt für die abgeleitete Klasse .
InformationsquelleAutor Infintyyy
Es hängt auch von der Art der Vererbung
class Derived : [public | protected | private] Base { };
Pollex, ich denke, die Art der Vererbung wirkt sich auf die Funktion zum überschreiben von Funktionen. Der folgende code wird nicht kompiliert: ideone.com/h59qb
Dies nicht kompilieren, weil Sie versuchen, implizit konvertiert einen Zeiger auf das Kind auf ein Zeiger-auf-Basis, die scheitert, weil
base
ist eine private Basis-Klasse (das ist, warum die Fehler inmain
statt der definition vonchild
). Dieser Fehler ist nicht durch das überschreiben.InformationsquelleAutor Andrii
Damit override eine Funktion, die von Basisklasse geerbt werden, es sollten beide
virtual
, und klassifiziert alspublic
oderprotected
.Der folgende code wird nicht kompiliert: codepad.org/lFUlNme8
Aber das wird: ideone.com/anUoc. In Ihrem Beispiel, Sie versuchen, rufen Sie eine private Funktion von
base
. Nurbase
tun kann.Danke für das code-snippet 🙂 ich verstehe einfach nicht, was ist der Vorteil der privaten, wenn der Körper der Funktion geändert werden kann in untergeordnete Klassen so leicht
@Xeo erwähnt in seiner Antwort, diese wird in der non-virtual-interface-idiom.
InformationsquelleAutor Meysam