我有一个基类,我希望它看起来像这样:
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++ - 如何在 C++ 构造函数中获得多态行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1453131/