我有一个带有抽象虚函数的基类
fv
,它仅在派生类中实现。我想确保派生类的 fv
在构造函数中或紧随其后调用。
但是,当我在构造函数中调用虚函数时,我收到警告,并且代码无法链接(对“A::fv()”的未定义引用),
我也尝试过这个:
class A{
A() {fx()};
virtual void fv() = 0;
void fx(fv());
}
class B : public A {
B():A();
void fv() {};
}
int main(int argc, char **argv) {
B::b{];
}
这段代码可以编译,但是当我运行它时,我得到了
pure virtual method called
terminate called without an active exception
Aborted
当然,我可以在
fv()
的构造函数中手动调用 B
,但这看起来不优雅且不安全,因为从我的 A
派生类的人可能会忘记调用 fv()
(这可能导致未定义的行为在我的真实代码中)。
是否有一种“自动”方法来确保派生类的
fv()
在对象实例化后立即被调用?
不能在基类构造函数中调用虚方法。派生类对象尚不存在。并且在构造函数之后没有自动调用方法的方法。
处理此问题的一种常见方法是将构造函数设为私有,然后定义一个工厂来创建实例。这样,每个实例都必须由您的工厂创建,并且您可以在构造函数之后执行您需要的任何操作。