2

これがコンパイルされないのはなぜですか?
error C2660: 'Concrete::WriteLine' : 関数は引数
を 1 つ取りません Line を追加するとわかります:
//using AbstractBase::WriteLine;
動作しますが、理由がわかりません。

#include "iostream" 

class AbstractBase
{
public:
   virtual void WriteLine() = 0;
   virtual void WriteLine( int i )
   {
      std::cout<<"AbstractBase"<<std::endl;
   }
};

class Concrete : public AbstractBase
{
public:
   //using AbstractBase::WriteLine;
   virtual void WriteLine()
   {
      std::cout<<"Concrete Sub Class"<<std::endl;
   }
};

int main()
{
   Concrete ff;
   ff.WriteLine();
   ff.WriteLine(1);
   return 0;
}

誰かがここで何が起こっているのか説明してもらえますか? ありがとう


この動作がC++標準から定義された動作であるかどうかは誰にもわかりますか? C++標準で言及されていますか?それとも、コンパイラの動作の一種ですか?

4

4 に答える 4

8

関数を宣言したら:

void WriteLine()

派生クラスでは、同じ名前のすべての基本クラス関数を非表示にします。
パラメータを取らない上記の関数は、同じ名前で 1 つのパラメータを取る関数を非表示にします。コンパイラは 1 つのパラメータを持つ関数を見つけることができないため、エラーを報告します。

この線:

using AbstractBase::WriteLine;

派生クラスの Base クラスからのすべての非表示の名前を有効にします。したがって、1 つのパラメーターを受け取る関数を使用できます

よく読んでください:
警告: Derived::f(char) hides Base::f(double)? の意味は何ですか?

于 2012-06-18T15:42:31.243 に答える
2

メソッドの隠蔽が発生します。基本クラスの他の関数は、同じ名前の関数によって隠されていますが、署名は異なります。

これを解決するには、次のusingディレクティブを使用できます。

using AbstractBase::WriteLine;

派生クラスで:

class Concrete : public AbstractBase
{
public:
   using AbstractBase::WriteLine;
   //using AbstractBase::WriteLine;
   virtual void WriteLine()
   {
      std::cout<<"Concrete Sub Class"<<std::endl;
   }
};
于 2012-06-18T15:42:04.513 に答える
1

派生クラスで関数を宣言すると、基本クラスで同じ名前を持つすべての関数が非表示になります。それらは、派生クラス関数の潜在的なオーバーロードとは見なされません。

宣言を追加するとusing、非表示の関数が派生クラスのスコープに戻り、派生クラスの関数と共に潜在的なオーバーロードと見なされます。

于 2012-06-18T15:42:14.393 に答える
1

問題は、Concrete::WriteLineすべてを隠していることAbstractBase::WriteLinesです。あなたは付け加えられます

using AbstractBase::WriteLine;

派生クラスに。

于 2012-06-18T15:42:35.483 に答える