gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:00 31 4
gpt4 key购买 nike

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

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不应该调用 myFunctionruntime期间.例如如果 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com