- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个有虚函数的基类:
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
而不是强制我实现一个通用的 myFunction
在DerivedClass
或特殊功能 DerivedClass::myFunction
?
注意:myFunction 中的断言是因为ClassB
不应该调用 myFunction
在runtime
期间.例如如果 myFunction
是getRadius
, DerivedClass<Circle>::getRadius()
没关系,但是 DerivedClass<Square>::getRadius()
不应该被调用。
注2:我查到的其他题目都不清楚这一点
最佳答案
Why it does not take
Base::myFunction
instead of forcing me to implement a genericmyFunction
inDerivedClass
or a specialized functionDerivedClass::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/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!