0

継承とテンプレート メソッドについて質問があります。この2つのクラスがあるとします

class Base
{
public:
   template<typename T>
   void print(const T& s) {std::cout << "Base (templated) prints " << s << "\n";}
   virtual void print(int i) {std::cout << "Base prints " << i << "\n";}
};

class Derived : public Base
{
public:
   void print(int i) {std::cout << "Derived prints " << i << "\n";}
}

int main()
{
   Derived d;
   d.print(3);     // works fine
   std::string s = "hi";
   d.print(s);  // does not compile
   return 0;
}

コンパイラは、「Derived::print(std::string&) の呼び出しに一致する関数がありません」と通知します。しかし、Base から継承する Derived は、テンプレート メソッド print(..) の呼び出しも許可する必要があります。

派生クラスでメソッド「print」を定義しないと、すべてが正常に機能し、コンパイラは基本クラスのテンプレート メソッドを呼び出します。

基本クラスを呼び出す派生クラスでもテンプレートメソッドを定義しても問題はありませんが、それは私には正しくないようです...

ご協力いただきありがとうございます。

4

2 に答える 2

2

派生クラスで関数を宣言すると、基本クラスで同じ名前の関数が非表示になります。using 宣言を使用してそれらを再表示できます。

class Derived : public Base
{
public:
    // Add this
    using Base::print;

    void print(int i) {std::cout << "Derived prints " << i << "\n";}
}
于 2012-09-06T16:47:01.693 に答える
1

これは標準の基本名 hide であり、基本クラス関数がテンプレートであるという事実とはまったく関係ありません。それはイエスの再臨である可能性があり、編集者はまだそれを隠しています。これは通常の動作であり、派生クラスを基本クラスの予期しない変更から保護しようとするために実装されています。

于 2012-09-06T16:45:48.137 に答える