如何确保在构造函数之后立即调用虚拟方法

问题描述 投票:0回答:1

我有一个带有抽象虚函数的基类

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()
在对象实例化后立即被调用?

c++ abstract-class
1个回答
0
投票

不能在基类构造函数中调用虚方法。派生类对象尚不存在。并且在构造函数之后没有自动调用方法的方法。

处理此问题的一种常见方法是将构造函数设为私有,然后定义一个工厂来创建实例。这样,每个实例都必须由您的工厂创建,并且您可以在构造函数之后执行您需要的任何操作。

© www.soinside.com 2019 - 2024. All rights reserved.