c++ - 如何在 C++ 构造函数中获得多态行为?

标签 c++ abstract virtual-functions

我有一个基类,我希望它看起来像这样:

class B
{
    // should look like: int I() { return someConst; }
    virtual int I() = 0;
    public B() { something(I()); }
}

重点是强制派生类重写I 并强制在构造每个对象时调用它。这用于做一些簿记,我需要知道正在构造什么类型的对象(但我将当前对象视为基类)。

这行不通,因为 C++ 不允许您从构造函数调用抽象虚函数。

有没有办法达到同样的效果?


基于 this link答案似乎是没有办法得到我想要的。然而它说的是:

The short answer is: no. A base class doesn't know anything about what class it's derived from—and it's a good thing, too. [...] That is, the object doesn't officially become an instance of Derived1 until the constructor Derived1::Derived1 begins.

然而,就我而言,我不想知道它是什么,而是它会成为。事实上,我什至不关心我得到什么,只要我用户可以(事后)将它映射到一个类。所以我什至可以使用返回指针之类的东西并摆脱它。

(现在回到阅读那个链接)

最佳答案

您不能从构造函数中调用虚方法(或者更准确地说,您可以调用它们,但您最终会从当前正在构造的类中调用成员函数)。 ,问题在于派生对象此时还不存在。您对此无能为力,从构造函数中多态调用虚拟方法根本不可能。

您应该重新考虑您的设计——例如,将常量作为参数传递给构造函数。

class B
{
public:
    explicit B(int i)
    {
        something(i);
    }
};

参见 C++ faq更多。如果你真的想在构造过程中调用虚函数,read this .

关于c++ - 如何在 C++ 构造函数中获得多态行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1453131/

相关文章:

c++ - 通过 qDebug 打印 qByteArray

在对象之前打印的 C++ 无意义对象

c# - 将 setter 添加到覆盖中的属性

c++ - 加速gcc中的虚函数调用

c++ - 使用虚函数的力量

c++ - 使用模板参数实例化模板类

c++ - 加载从信号槽接收到的 QStringList 值

c# - 使用 C# 和 gppg,我将如何构建抽象语法树?

c# - 接口(interface)还是抽象类?

c++ - C++中虚函数的编译时静态类型检查