2012-04-09 7 views
6

Beispiel:Warum Zuordnung Betreiber von übergeordneter Klasse nicht zugänglich von abgeleiteten Klasse sind Objekte

class C 
{ 
    public: 
    void operator =(int i) {} 
}; 

class SubC : public C 
{ 
}; 

Im Folgenden werden Kompilierungsfehler:

SubC subC; 
subC = 0; 

„keine Übereinstimmung für‚operator =‘in‚TLN = 0 '"

Einige Quellen geben an, dass dies darauf zurückzuführen ist, dass Zuweisungsoperatoren nicht vererbt werden. Aber liegt es nicht einfach daran, dass die standardmäßig erstellte Kopierzuweisung von SubC sie überschattet?

Antwort

11

Der Kopierzuweisungsoperator wird automatisch in der abgeleiteten Klasse generiert. Dies führt dazu, dass der Zuweisungsoperator der Basisklasse aufgrund der regulären Regeln zum Verbergen von Namen in C++ ausgeblendet wird. Sie können den Namen in der Basisklasse über die Anweisung "using" einblenden. Zum Beispiel:

class C 
{ 
    public: 
    void operator =(int i) {} 
}; 

class SubC : public C 
{ 
    public: 
    using C::operator=; 
}; 
+1

Oder nennen Sie es direkt 'subC.C :: operator = (0);' –

2

Ein Kopierzuweisungsoperator für eine Basisklasse verfügt nicht über die Signatur, die für einen Kopierzuweisungsoperator für eine abgeleitete Klasse erforderlich ist. Sie wird von der abgeleiteten Klasse geerbt, bildet jedoch keinen Kopierzuweisungsoperator darin. Obwohl Zuweisungsoperatoren wie andere Memberfunktionen vererbt werden, wird keine Kopierzuweisung bereitgestellt.

+4

Das stimmt im Allgemeinen nicht. Zum Beispiel kann Operator + vererbt werden. –

1

Ich habe es nicht getan, aber nach The Man Himself (Stroustrup) ist es ein Merkmal von C++ 11, um es mit Konstrukteuren, aber es ist in da C++ 98, es zu tun mit anderen Methoden.

Dies wird direkt über den Link gehoben:

People sometimes are confused about the fact that ordinary scope rules apply to class members. In particular, a member of a base class is not in the same scope as a member of a derived class:

struct B { 
    void f(double); 
}; 

struct D : B { 
    void f(int); 
}; 

B b; b.f(4.5); // fine 
D d; d.f(4.5); // surprise: calls f(int) with argument 4 

In C++98, we can "lift" a set of overloaded functions from a base class into a derived class:

struct B { 
    void f(double); 
}; 

struct D : B { 
    using B::f;  // bring all f()s from B into scope 
    void f(int); // add a new f() 
}; 

B b; b.f(4.5); // fine 
D d; d.f(4.5); // fine: calls D::f(double) which is B::f(double) 

Also los ya. Sie können wahrscheinlich "es nehmen, wenn Sie es wollen" sogar vor C++ 11, obwohl ich es selbst nicht versucht habe.

0

Mit Ausnahme des Kopierzuweisungsoperators kann ein anderer überladener Operator vererbt werden.

stimme ich der Meinung, dass standardmäßig konstruierte Kopier Zuordnung von SubC Betreiber von C. überladene Zuweisung

Wenn SubC eine Kopie-Zuweisungsoperator nicht bieten den Schatten, Compiler würde eine Kopie-Zuweisungsoperation Synthèse, als folgen:

class SubC : public C 
{ 
public: 
    SubC & operator=(const SubC & other); 
} 

dann der '& SubC operator = (const SubC & andere)' überschattet Zuweisungsoperator von C, Ergebnisse in Compiler-Fehler.

Wenn

SubC other; 
SubC subC; 

subC = other; 

dann, ist dieser Fall, kompilieren ok.