0

基本クラスAが抽象である場合、クラス階層全体に共通するいくつかの関数を除いて...クラスBが宣言されます。

template <class widgetType> class B : public A { ... };

そしてクラスCは宣言されています:

class C : public B<myWidget> { ... };

Aで宣言された関数の一部がクラスCに継承されない理由はありますか?

同じ名前で異なるパラメーターがAに実装されている2つの(仮想)関数があり、そのうちの1つはCでオーバーライドされます。クラスCのインスタンスでオーバーライドされていない関数にアクセスしようとすると、コンパイラーはそれを見つけることができません。私は何も悪いことを見ることができません...それで私は私が理解していないテンプレートと継承に関する特別な規則があるかどうか知りたいです。

4

1 に答える 1

1

名前は同じだがパラメーターが異なる

関数の隠蔽に遭遇しました。クラスが基本クラスのメソッドと同じ名前のメソッドを定義する場合、それがオーバーライドであるかどうかに関係なく、そのメソッドは基本クラスから他のメソッドを非表示にします。テンプレートはそれとは何の関係もありません。

コンパイラが関数名を解決しようとするとき、最初に最も派生したクラスのコンテキストを調べます。そこで定義された名前が見つかった場合、それ以上の検索を停止し、同じレベルで定義された名前のみを考慮します。

于 2012-10-05T03:50:25.770 に答える