BCS*_*BCS 5 c++ virtual-functions abstract
我有一个基类,我想看起来像这样:
class B
{
// should look like: int I() { return someConst; }
virtual int I() = 0;
public B() { something(I()); }
}
Run Code Online (Sandbox Code Playgroud)
要点是强制派生类重写I
并强制在构造每个对象时调用它.这习惯于做一些簿记,我需要知道正在构造什么类型的对象(但我否则将当前对象视为基类).
这不起作用,因为C++不允许您从构造函数中调用抽象虚函数.
有没有办法达到同样的效果?
根据这个链接,似乎答案是没有办法得到我想要的.不过它说的是:
最简洁的答案是不.基类不知道它从哪个类派生出来 - 这也是一件好事.
[...]
也就是说,在构造函数Derived1 :: Derived1开始之前,对象不会正式成为Derived1的实例.
但是在我的情况下,我不想知道它是什么,但它会变成什么.事实上,只要我用户可以(事后)将其映射到一个类,我甚至不关心我得到什么.所以我甚至可以使用像返回指针这样的东西来逃避它.
(现在回到阅读该链接)
你不能从构造函数中调用虚方法(或者更确切地说,你可以调用它们,但你最终会从当前正在构造的类中调用成员函数).问题是派生对象没有但那时候还存在.你可以做的很少,从构造函数中多态调用虚方法简直是不可能的.
您应该重新考虑您的设计 - 例如,将常量作为参数传递给构造函数.
class B
{
public:
explicit B(int i)
{
something(i);
}
};
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅C++ faq.如果您真的想在构建期间调用虚函数,请阅读此内容.
归档时间: |
|
查看次数: |
3463 次 |
最近记录: |