c++ - 在派生模板类中重新实现基类的虚函数

标签 c++ templates c++11

我有一个具有虚函数的基类:

class Base {
   ...
   virtual void myFunction() { assert(0 && "not implemented yet"); }

}

以及 Base 的派生(模板)类:

DerviedClass.hpp:

Template<typename T>
class DerivedClass : public Base, public T {

  ...
  void myFunction();

}

派生类.cpp:

template <>
void DerivedClass<ClassA>::myFunction() {
 //Something ClassA is suppose to do
}

这可以编译。但是当我尝试实例化 DerivedClass<ClassB> 时我收到错误:

IProject.o:-1: erreur : undefined reference to `DerivedClass<ClassB>::myFunction()'

为什么我会出现这个错误?为什么不采取 Base::myFunction而不是强制我实​​现通用的 myFunctionDerivedClass或专门功能DerivedClass::myFunction

注意: myFunction 中的断言是因为 ClassB不应该打电话 myFunction期间runtime 。例如,如果 myFunctiongetRadius , DerivedClass<Circle>::getRadius()还可以,但是DerivedClass<Square>::getRadius()不应该被调用。

注2:我发现的其他主题对此并不清楚

最佳答案

Why it does not take Base::myFunction instead of forcing me to implement a generic myFunction in DerivedClass or a specialized function DerivedClass::myFunction?

你自己通过声明强制这样做:

void myFunction();

考虑完全专门化类模板,这将有条件地生成类,无论是否覆盖 myFunction,例如:

template <typename T>
class DerivedClass : public Base, public T {
    // not overriding    
};

template <>
class DerivedClass<ClassA> : public Base, public ClassA {
    void myFunction() override;
};

template <>
void DerivedClass<ClassA>::myFunction() {
    // something ClassA is supposed to do
}

如果有一些常见的东西,你可以把它放在:

template <typename T>
class DerivedClassCommons : public Base, public T {
    // common stuff
};

然后重构 DerivedClass 以使用此类模板的单一继承。

这就是您的问题,但正如其他人指出的那样,我认为您有一个更大的设计问题。

关于c++ - 在派生模板类中重新实现基类的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38636730/

相关文章:

c++ - bitset 是否保证连续性?

c++ - 为什么我的代码无法编译? (完美转发和参数包)

c++ - 捕获此的 lambda 的访问权限

c++ - 包含包含文件的文件时出现问题

c++ - 未命名类型错误是由于现有枚举造成的,但为什么呢?

c++ - 相同类型重新定义的 Clang typedef(和别名)导致意外错误

django - Heroku Django,模板不存在错误

c++ - 如何检测Windows 2012 Core 版(C++)

c++ - 通过 c++ pugixml 库检索 PCDATA xpath

c++ - 限制基本模板实例化