Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板化方法的继承_C++_Templates_Inheritance - Fatal编程技术网

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谢谢!出于某种原因,我认为既然两个方法中的一个是模板化的,而另一个不是模板化的,那么它们就不会被认为是相同的。另外,因为基类有一个方法(未模板化),它与作为签名的派生方法完全匹配。所以我认为派生方法只隐藏了那个方法。(我对问题进行了编辑,以便在基类中也包括非模板版本)。谢谢!出于某种原因,我认为既然两个版本中的一个是模板版本,而另一个不是,它们就不会被认为是相同的。还因为基类有一个方法(非模板版本)这与作为签名的派生版本完全匹配。所以我认为派生版本只隐藏了那个。(我编辑了这个问题,将非模板版本也包括在基类中)。好的,我编辑了这个问题,因为我遗漏了一些特殊的问题。我试图简化这个问题,但可能遗漏了重要的细节(比如虚拟函数)。好的,我编辑了这个问题,因为我遗漏了一些特殊的问题。我试图简化这个问题,但我可能遗漏了一些重要的细节(比如虚拟函数).谢谢!出于某种原因,我认为我无法隐藏模板方法…我只是认为它不同…谢谢!出于某种原因,我认为我无法隐藏模板方法…我只是认为它不同。。。