从派生模板类中的基类重新实现虚拟函数
Reimplement a virtual function from base class in a derived template class
我有一个基类,它有一个虚拟函数:
class Base {
...
virtual void myFunction() { assert(0 && "not implemented yet"); }
}
和衍生的(模板)基类:
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
,而不是强迫我在DerivedClass
中实现通用myFunction
或专用函数DerivedClass::myFunction
?
注意:myFunction中的断言是因为ClassB
不应该在runtime
期间调用myFunction
。例如,如果myFunction
是getRadius
,则DerivedClass<Circle>::getRadius()
可以,但不应调用DerivedClass<Square>::getRadius()
。
注意2:我发现的其他主题不清楚这一点
为什么不使用
Base::myFunction
,而不是强迫我在DerivedClass
中实现通用myFunction
或专用函数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
};
然后重构CCD_ 18以使用该类模板的单一继承。
这就是你的问题,但正如其他人所指出的,我认为你有一个更大的设计问题。
修复编译器错误(而不是设计错误)的另一种方法是将myFunction
的定义移动到派生模板:
class Base {
virtual void myFunction() = 0;
}
template<typename T>
class DerivedClass : public Base, public T {
void myFunction() {
throw "not implemented, go away";
}
}
然后只专门研究你需要的方法:
template <>
void DerivedClass<ClassA>::myFunction() {
//Something ClassA is suppose to do
}
函数已经为所有类型声明了。定义可能来自任何地方,包括其他编译单元。只有当函数被引用时,您才需要定义,而您的虚拟函数在构造过程中(隐式)被引用。
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- C++ 如何使用动态计算的新节点实现 A*?
- 实现一个函数,该函数将字符串作为输入并返回一个新字符串,辅音字母不替换为 "!"
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 为什么这个新的 [ ] 和删除 [ ] 实现会分解为 12 >整数?
- 在不创建新节点的情况下实现带有映射的trie
- 使用 Qt5 的新信号/插槽实现向滑块发出信号
- 如何实现由TPAINTBOX创建的新组件的OnMousedown,OnMouseUp事件
- 如何自己为我自己的shared_ptr实现实现别名构造函数
- 为什么我不能使私人运营商成为新的并使用默认实现?
- 如何向 C++ 中无法访问其实现的类添加新函数
- 在哪里可以找到C 中新运营商的确切实现
- C++新的不同实现
- 如何实现一个创建新对象并返回对它的引用的C++方法
- 如何实现消费者生产者,消费者可以请求新的数据
- 这个UTF-8实现实现是定义的还是定义良好的
- 如何实现C++"新"运算符
- 我可以在不使用新关键字的情况下以某种方式实现这一点吗?C++
- 如何实现一个简单的容器放置新和放置功能
- 您将如何重构这种多态设计,以便在添加新实现时使其更加灵活?