c++ - 虚拟模板函数重载

标签 c++ templates c++11

template <class T, class U, class Child>
class Parent {
public:
  virtual T blah() {
     return gaga;
  }
protected:
  T gaga;
};

class Child : public Parent<double, double, Child> {
  virtual void blah(int overloaded) {
  }

  virtual void func() {
    blah();
  }
};

int main() {
  Child* p = new Child();
}

为什么上面的代码不能编译?为什么我不能像那样重载我的虚函数?

我得到的错误:

prog.cpp: In member function ‘virtual void Child::func()’:
prog.cpp:16: error: no matching function for call to ‘Child::blah()’
prog.cpp:12: note: candidates are: virtual void Child::blah(int)
prog.cpp: In function ‘int main()’:
prog.cpp:21: warning: unused variable ‘p’

最佳答案

Child 中的方法void blah(int) 隐藏了Parent 中继承的T blah()。您可以通过添加行

来取消隐藏它
using Parent::blah; 

child 。如果您希望能够访问 Parent::blah(),您必须确保 using 语句位于公共(public)访问部分。所以你必须添加

public:
  using Parent::blah;
private:
  ...

Child 的顶部,使 Parent::blah() 对所有对象可见。您还可以使用 Parent::blah() 而不仅仅是 blah() 显式引用基类方法。更多信息可用 here .

关于c++ - 虚拟模板函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9134412/

相关文章:

C++,错误 C2448 - 函数样式初始值设定项似乎是函数定义

c++ - 为什么我的 fstream 没有创建 data1.txt 文件?

c++ - 在自身内部定义类的标准实例 (C++)

c++ - 继承和 is_detected_v 提供了一个奇怪的结果 (C++17)

c++ - 为什么 std::rotate 这么快?

C++/C int32_t 和 printf 格式 : %d or %ld?

c++ - 为什么限定名错误?

c++ - 如何在非类型模板类的专门化声明之外定义方法?

c++ - 可以编写一个接受类型并返回不同类型的函数吗

c++ - 使两种类型的相同模板兼容