所以,基于粗略搜索,我已经知道从构造函数中调用虚函数(纯函数或其他函数)是不行的。我重新构建了我的代码,以确保我没有这样做。虽然这会导致我的类的用户在他们的代码中添加一个额外的函数调用,但这真的不是什么大不了的事。也就是说,它们不是在循环中调用构造函数,而是调用函数(事实上!)来提高代码的性能,因为我们没有每次构建和销毁有问题的对象的管理。
然而,我偶然发现了一些有趣的事情......
在抽象课中,我有类似的东西:
// 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.Func();)来使用该类,应该正确地重载所有纯虚函数。< / p>
通过这种方法,我有什么遗漏或做错了吗?谢谢你的帮助!
答案 0 :(得分:4)
Func正在调用虚拟虚拟虚拟虚拟虚拟环境。您必须使用范围运算符限定调用,即AbstractClass :: Step1()以调用THAT(虚拟纯)函数。既然你不是,你将总是通过派生类获得实现。
答案 1 :(得分:1)
基类中的虚函数使派生类能够覆盖它。但似乎事情就止于此了。
但是如果基类虚函数是纯函数,则会强制派生类实现该函数。
答案 2 :(得分:-1)
作为附注,您可以将Step1,Step2,Step3方法设为私有,以便编译器阻止您直接调用它们。