Der Beispielcode der Frage zum Zeitpunkt des Verfassens:
class TestA
{
public:
const TestA &operator=(const int A){return *this;}
};
class TestB : public TestA
{
public:
//Vererbung?
};
Frage 1: "Wird der Zuweisungsoperator (oder ein anderer Operator) vererbt?"
Ja, natürlich. Die einzigen Elementfunktionen, die nicht in C++98 vererbt werden, sind Konstruktoren. Die Implementierungen der Basisklasse werden jedoch standardmäßig vom automatisch generierten Kopiezuweisungsoperator verborgen. Beispiel:
#include <iostream>
using namespace std;
class TestA
{
public:
TestA const& operator=( int const )
{
cout << "TestA = int" << endl;
return *this;
}
};
class TestB : public TestA
{
public:
// Automatisch generierter Kopiezuweisungsoperator.
};
int main()
{
TestB o;
cout << "Aufruf des automatisch generierten Kopiezuweisungsoperators:" << endl;
cout << "(sollte hier nichts stehen ->) "; o = TestB();
cout << endl;
cout << endl;
cout << "Aufruf des Zuweisungsoperators der Basisklasse:" << endl;
// o = 42; // kompiliert nicht, da er verborgen ist.
cout << "(sollte hier eine Ausgabe stehen ->) "; o.TestA::operator=( 42 ); // OK.
cout << endl;
}
Angesichts aller bisherigen Antworten, die Verbargenes und Vererbung verwechselt haben, und um hier nur die Terminologie zu klären, sagt N3290 (welches dem C++11-Standard identisch ist):
N3290 §10/2:
"Vererbene Elemente können in Ausdrücken auf die gleiche Weise wie andere Elemente der abgeleiteten Klasse verwiesen werden, es sei denn, ihre Namen sind verborgen oder mehrdeutig"
In dem obigen Beispielcode ist TestA::operator=
verborgen, siehe jedoch die Antwort zu Frage 3.
Frage 2: Ist das Folgende gültig?
Die Frage bezieht sich auf die Verwendung von using
in der abgeleiteten Klasse, so wie:
class TestB : public TestA
{
public:
using TestA::operator=;
//Vererbung?
};
Ja, das ist gültig.
In C++98 wäre dies nicht für einen Konstruktor gültig, da Konstruktoren nicht vererbt werden.
Frage 3: Wenn es gültig ist, macht es einen Unterschied?
Ja, es ermöglicht den direkten Zugriff auf den Zuweisungsoperator der Basisklasse in der abgeleiteten Klasse.
Beispielsweise können Sie dann das Auskommentieren im obigen Beispiel entfernen,
// o = 42; // kompiliert nicht, da er verborgen ist.
und es wird immer noch kompilieren,
o = 42; // kompiliert einwandfrei mit "using".
Prost & hth.,