2011年02月17日

operator=()は継承されない

#include <iostream>
using namespace std;

class C {
public:
	C() : v(0) {}
	int operator=(const int &rhs) { return v = rhs; }
//	int operator+=(const int &rhs) { return v += rhs; }	←=以外は問題ない
	int v;
};

struct  D : public C {
};

int main()
{
	D d;
	cout << d.v << endl;
	d = 10;
	cout << d.v << endl;
}

これが通らない。例えばVC++2010だと、

test.cpp(19) : error C2679: 二項演算子 '=' : 型 'int' の右オペランドを扱う演算子が見つかりません (または変換できません)。
		test.cpp(13): 'D &D::operator =(const D &)' の可能性があります。
		引数リスト '(D, int)' を一致させようとしているとき

……という感じのコンパイルエラーが発生する。

Dクラスを以下のようにすれば問題ない。

struct  D : public C {
	using C::operator=;	// ←これが要る
//	int operator=(const int &rhs) { return C::operator=(rhs); }	// ←或いはこれ
};

コード全体(と、実行結果)はideone.comを。

OK、継承されないという事も回避策も分かった。だが何故継承されないという仕様になっているのだろう?

ラベル:C++
posted by 天井冴太 at 16:49| Comment(0) | TrackBack(0) | Study | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は180日以上新しい記事の投稿がないブログに表示されております。