我对继承和模板方法有疑问。假设我有这两个类
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&amp;)''。 但Derived,继承自Base,还应允许调用模板方法print(..),no?
如果我没有在派生类中定义方法“print”,那么事情也很奇怪,那么一切正常,编译器会调用基类模板方法。
如果我在派生类中定义模板方法也会正常工作,派生类调用基类1,但这对我来说似乎不对...
感谢您的帮助。
答案 0 :(得分:2)
在派生类中声明一个函数会隐藏基类中具有相同名称的所有函数。您可以使用声明取消隐藏它们:
class Derived : public Base
{
public:
// Add this
using Base::print;
void print(int i) {std::cout << "Derived prints " << i << "\n";}
}
答案 1 :(得分:1)
这是一个标准的基本名称hide,并且绝对没有任何与基类函数是模板的事实有关。它可能是耶稣的第二次降临,编译器仍会隐藏它。这是正常行为,用于尝试保护派生类免受基类中的意外更改。