2012-04-09 16 views
6

例オブジェクト:親クラスの代入演算子は、派生クラスからアクセスすることはできませんなぜ

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

class SubC : public C 
{ 
}; 

以下はコンパイルエラーを与える:

SubC subC; 
subC = 0; 

「「SUBCで 『演算子=』の一致なし= 0 '"

一部の情報源には、代入演算子が継承されていないために記述されています。しかし、単純にデフォルトの作成されたコピー割り当てSubCがそれらを覆い隠すのではないでしょうか?

答えて

11

コピー代入演算子は、派生クラスで自動的に生成されます。これにより、C++の規則的な名前隠蔽規則のために、基本クラスの代入演算子が隠されます。 "using"ディレクティブを使用して、ベースクラスの名前を再表示することができます。たとえば:

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

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

または直接 'subC.C :: operator =(0);'と呼んでください。 –

2

基本クラスのコピー代入演算子には、派生クラスのコピー代入演算子に必要な署名がありません。それは派生クラスによって継承されますが、その中にコピー代入演算子を構成しません。したがって、代入演算子は他のメンバー関数と同様に継承されますが、コピー代入は行われません。

+4

これは一般的には当てはまりません。たとえば、operator +は継承できます。 –

1

私はそれを行っていないが、The Man Himself(Stroustrup氏)によると、それはコンストラクタでそれを行うためのC++ 11の機能だが、それはそれを行うにはC++ 98以降でてきています他の方法で。

これは、直接リンクから持ち上げられる:

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) 

そうそこ屋に行きます。あなたはおそらくC + + 11の前であっても、自分がそれを試したことはありませんが、 "望むならそれを取る"ことができます。

0

コピー代入演算子を除いて、他のオーバーロードされた演算子を継承できます。

は私がSUBCのデフォルトの構築コピー割り当てはC.

のオーバーロード代入演算子の影が薄いという意見に同意

SUBCがコピー代入演算子を提供しない場合、コンパイラは として、コピー代入演算をsyntheseう次のとおり

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

次いで 'SUBC &演算子=(CONST SUBC他&)' は、コンパイルエラーに 結果、Cの代入演算子を曇らせます。

その後、

SubC other; 
SubC subC; 

subC = other; 

場合、この場合は、[OK]をコンパイルします。

関連する問題