C++ 模板化方法的继承
我有一个关于继承和模板方法的问题。假设我有这两门课C++ 模板化方法的继承,c++,templates,inheritance,C++,Templates,Inheritance,我有一个关于继承和模板方法的问题。假设我有这两门课 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 " <&
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;
}
类基
{
公众:
模板
无效打印(常量T&s){std::cout这是一个标准的基名隐藏,与基类函数是一个模板这一事实完全无关。它可能是耶稣的第二次降临,编译器仍然会隐藏它。这是正常的行为,实现它是为了尝试保护派生类不受基类中意外更改的影响。这是一个标准的基名隐藏,与基类函数是一个模板这一事实完全无关。它可能是耶稣的第二次降临,编译器仍然会隐藏它。这是一种正常的行为,实现它是为了尝试保护派生类不受基类中意外更改的影响。声明函数in派生类隐藏基类中具有相同名称的任何函数。您可以使用using声明取消隐藏它们:
class Derived : public Base
{
public:
// Add this
using Base::print;
void print(int i) {std::cout << "Derived prints " << i << "\n";}
}
派生类:公共基
{
公众:
//加上这个
使用Base::print;
void print(int i){std::cout在派生类中声明函数会隐藏基类中具有相同名称的任何函数。您可以使用using声明取消隐藏它们:
class Derived : public Base
{
public:
// Add this
using Base::print;
void print(int i) {std::cout << "Derived prints " << i << "\n";}
}
派生类:公共基
{
公众:
//加上这个
使用Base::print;
void print(int i){std::cout谢谢!出于某种原因,我认为既然两个方法中的一个是模板化的,而另一个不是模板化的,那么它们就不会被认为是相同的。另外,因为基类有一个方法(未模板化),它与作为签名的派生方法完全匹配。所以我认为派生方法只隐藏了那个方法。(我对问题进行了编辑,以便在基类中也包括非模板版本)。谢谢!出于某种原因,我认为既然两个版本中的一个是模板版本,而另一个不是,它们就不会被认为是相同的。还因为基类有一个方法(非模板版本)这与作为签名的派生版本完全匹配。所以我认为派生版本只隐藏了那个。(我编辑了这个问题,将非模板版本也包括在基类中)。好的,我编辑了这个问题,因为我遗漏了一些特殊的问题。我试图简化这个问题,但可能遗漏了重要的细节(比如虚拟函数)。好的,我编辑了这个问题,因为我遗漏了一些特殊的问题。我试图简化这个问题,但我可能遗漏了一些重要的细节(比如虚拟函数).谢谢!出于某种原因,我认为我无法隐藏模板方法…我只是认为它不同…谢谢!出于某种原因,我认为我无法隐藏模板方法…我只是认为它不同。。。