【问题标题】:Inheritance of templated methods模板化方法的继承
【发布时间】:2012-09-06 16:44:06
【问题描述】:

我有一个关于继承和模板方法的问题。假设我有这两个类

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”,事情也很奇怪,然后一切正常,编译器调用基类模板方法。

如果我也在派生类中定义模板方法,它也可以正常工作,它调用基类之一,但这对我来说似乎不正确......

感谢您的帮助。

【问题讨论】:

  • 好吧,我编辑了这个问题,因为我遗漏了一些特别的问题。我试图简化问题,但我可能遗漏了重要的细节(如虚函数)。

标签: c++ templates inheritance


【解决方案1】:

在派生类中声明一个函数会隐藏基类中的所有同名函数。您可以使用 using 声明取消隐藏它们:

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

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

【讨论】:

  • 谢谢!出于某种原因,我认为由于两者中的一个是模板化的,而另一个不是模板化的,因此它们不会被认为是相同的。也因为 Base 类有一个方法(不是模板化的),它与派生的方法完全匹配作为签名。所以我虽然派生的只隐藏了那个。 (我编辑了问题,在基类中也包含了非模板版本)。
【解决方案2】:

这是一个标准的基名称 hide,与基类函数是模板这一事实完全没有任何关系。它可能是耶稣的第二次降临,编译器仍然会隐藏它。这是正常行为,旨在尝试保护派生类免受基类中意外更改的影响。

【讨论】:

  • 谢谢!出于某种原因,我虽然无法隐藏模板方法...我只是认为它不同...
猜你喜欢
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多