Rein virtuelle Methoden in abgeleiteten abstrakten Klasse
Sagen, wir haben diese:
class A
{
public:
virtual void foo() = 0;
};
class B: public A
{
public:
virtual void foo() = 0;
};
Der compiler wirft keine Fehler, ich denke, es ist weil B ist ebenfalls eine abstrakte Klasse ist und als solche Sie nicht haben, zu implementieren foo
aus A.
Aber was hat solch ein Konstrukt zu bedeuten?
1) foo
von B ausblenden foo
aus?
2) Die erste Klasse, die erbt von B und ist nicht eine abstrakte Klasse ist, muss es zwei Implementierungen wie:
class C: public B
{
public:
virtual void A::foo() {};
virtual void B::foo() {};
};
Der compiler beschwert sich nur, wenn die Durchführung des B::foo()
fehlt, aber man beschwert sich nicht über fehlende A::foo()
.
Alles in allem: ist dies ein Weg, um zu verbergen, rein virtuelle Methoden?
- Wie genau hast du es verstecken?
- Wenn ich nicht eine Implementierung für A::foo() in C, ich kann auch instanziieren ein Objekt von C. Also ist C immer instanziiert werden, auch wenn A::foo() fehlt. Also dachte ich, dass irgendwie A::foo() ist nicht erforderlich, in C, daher "versteckt".
- Da B erbt A..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie ersten erklären:
erklären Sie die Methode
foo
öffentlichen, virtuellen und rein. Wenn eine Klasse enthält mindestens eine Reine Methode genannt abstrakte. Was bedeutet es? Es bedeutet, dass die Klasse nicht instanziiert werden kann, denn es braucht die reinen Methoden-Implementierungen.Können Sie natürlich Erben von einer abstrakten Klasse (ich würde sagen, dass Sie gezwungen sind, das zu tun, was sonst wäre die Notwendigkeit einer abstrakten Klasse, die Sie nicht verwenden, außer für die Bereitstellung einer Schnittstelle zu Erben?) und Sie können auch Erben von einer abstrakten Klasse und implementieren Sie einige oder alle der Reine Methoden von der übergeordneten Klasse; in diesem Fall werden die Kind-Klasse ist Abstrakt, das ist der Fall der Klasse B:
In B könnte man leicht weglassen
virtual void foo() = 0;
Erklärung, weil die definition wird bereits von der Basisklasse geerbt. In diesem Fall der Klasse B ist eine abstrakte Klasse und kann deshalb nicht instanziiert werden, wie A.Beantworten Ihre Fragen direkt:
Nein, tut es nicht. Sie sind beide deklarieren eine Reine Methode (die ist in der Tat die gleiche Methode), daher gibt es wirklich nichts zu verstecken.
Nein, natürlich nicht. Wie oben erwähnt, sind Sie der gleichen Methode, also wenn die Klasse C haben, um eine Umsetzung für
foo
sollte es einfach umzusetzenfoo
:Virtual
wirklich erforderlich, in der Klasse C. Kann es nicht sein nurvoid foo() {};
?Wird es werfen eine Fehlermeldung, wenn Sie versuchen, instanziieren Sie ein Objekt aus
A
oderB
was Sie sind Abstrakt. Nicht, wenn man erbt, und er erklärt Sie.Nicht. Es overtides
A::foo
nicht es versteckt.Nicht. Nur überschreiben
foo
und machen die Umsetzung für Sie.C
dann umsetzen mussfoo
B::foo
ist nicht das gleiche wieA::foo
, und nicht verstecken es (ebenso wie übergeordnete it).Ich kompiliert Ihren code mit gcc 4.5.3, es gab folgende Fehlermeldungen:
In der Sie beispielsweise die Klasse
A
undB
sind abstrakte Klassen, da foo ist rein virtuell. Sie definieren lediglich, dass die abgeleitete Klasse B sollten zu implementieren, die das Verhalten vonfoo
da es kein Standard-Verhalten zu verwenden (wenn die abgeleitete Klasse ist nicht Abstrakt mehr).Question 1:Does foo from B hide foo from A?
Seit
foo
imB
undA
hat genau den gleichen Namen, gleiche Signatur und foo virtual in der Basisklasse, also es ist nicht versteckt, es ist überschreiben. FYI: Eine abgeleitete Klasse die Funktionoverrides
eine Basisklasse Funktion, wenn die Signatur, ist der gleiche und es ist als virtual deklariert, die in der Basisklasse. Wenn Sie es nennenüber einen Zeiger oder eine Referenz auf die Basisklasse, die von der Funktion in der
abgeleiteten Klasse aufgerufen wird. Es "überschreibt" der in der base-Klasse.
Hiding
kommt nur ins Spiel, wenn ein Aufruf einer nicht-virtuellen Funktion über einenZeiger oder Referenz oder direkt mit einem Objekt der abgeleiteten Klasse. Ein
abgeleitete Klasse " - Funktion blendet alle Basis-Funktionen der Klasse mit dem gleichen Namen.
Question 2: The first class which inherits from B and is not an abstract class, does it have to provide two implementations
Nicht. Sie können Folgendes tun: