从抽象基类成员函数调用纯虚拟函数
Calling Pure Virtual Function From Abstract Base Class Member Function?
因此,基于粗略的搜索,我已经知道从构造函数调用虚拟函数(纯函数或其他函数)是不可行的。我已经重组了我的代码,以确保我不会这么做。虽然这会导致我的类的用户在他们的代码中添加一个额外的函数调用,但这真的没什么大不了的。也就是说,他们现在不是在循环中调用构造函数,而是调用函数,这(事实上!)提高了代码的性能,因为我们不需要每次都构建和销毁有问题的对象。
然而,我偶然发现了一些有趣的东西。。。
在抽象类中,我有这样的东西:
// in AbstractClass.h:
class AbstractClass {
public:
AbstractClass() {}
virtual int Func(); //user can override
protected:
// Func broken up, derived class must define these
virtual int Step1() = 0;
virtual int Step2() = 0;
virtual int Step3() = 0;
// in AbstractClass.cpp:
int AbstractClass::Func() {
Step1();
// Error checking goes here
Step2();
// More error checking...
// etc...
}
基本上,纯虚拟函数大多数时候都遵循一个通用结构,但如果不遵循,Func()是虚拟的,并允许派生类指定顺序。但是,每个步骤都必须在派生类中实现。
我只是想确保我在这里没有做错什么,因为Func()函数调用的是纯虚拟函数。也就是说,使用基类,如果调用StepX(),就会发生不好的事情。但是,该类是通过创建派生对象,然后调用Func()来使用的(例如,MyDerivedObject.Fonc();)在该派生对象上,应该正确重载所有纯虚拟函数。
按照这种方法,我有没有遗漏或做得不正确?谢谢你的帮助!
Func调用的是虚拟的,而不是纯虚拟的。您必须使用作用域运算符来限定调用,即AbstractClass::Step1()才能调用the(虚拟纯)函数。由于不是,所以您将始终通过派生类获得实现。
但是,如果基类虚拟函数是纯的,则会强制派生类实现该函数。
作为附带注释,您可以将Step1、Step2和Step3方法设为私有方法,这样编译器就可以阻止您直接调用它们。
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数