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

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

}

和Base的派生(模板)类:

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

  ...
  void myFunction();

}

DerivedClass.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而不是强制我在myFunction或专用函数DerivedClass中实现通用DerivedClass::myFunction

注意:mysqlt_rstrong在myFunction中的断言是因为ClassBmyFunction期间不应该调用runtime。例如,如果myFunctiongetRadiusDerivedClass<Circle>::getRadius()可以,但是不应调用DerivedClass<Square>::getRadius()

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

最佳答案



您通过声明强制自己:

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/

10-13 08:10