【发布时间】:2012-07-07 18:32:40
【问题描述】:
这是来自 C++11 标准 sec 12.7.4。这很令人困惑。
- 文中最后一句究竟是什么意思?
- 为什么
B::B中的最后一个方法调用未定义?不应该直接叫a.A::f吗?
可以调用4个成员函数,包括虚函数(10.3) 在建造或销毁期间 (12.6.2)。当一个虚函数 从构造函数或从 析构函数,包括在构造或销毁 类的非静态数据成员,以及调用的对象 apply 是正在构造或销毁的对象(称为 x), 调用的函数是构造函数中的最终覆盖器或 析构函数的类,而不是在派生更多的类中覆盖它。 如果虚函数调用使用显式类成员访问 (5.2.5) 和对象表达式是指 x 的完整对象 或该对象的基类子对象之一,但不是 x 或其之一 基类子对象,行为未定义。 [ 例子:
struct V { virtual void f(); virtual void g(); }; struct A : virtual V { virtual void f(); }; struct B : virtual V { virtual void g(); B(V*, A*); }; struct D : A, B { virtual void f(); virtual void g(); D() : B((A*)this, this) { } }; B::B(V* v, A* a) { f(); // calls V::f, not A::f g(); // calls B::g, not D::g v->g(); // v is base of B, the call is well-defined, calls B::g a->f(); // undefined behavior, a’s type not a base of B }——结束示例]
【问题讨论】:
-
不,不是那个问题。这是一个不同的。虚函数问题是次要的。
-
@Harvey:这不是一个骗局。这个问题超出了您所引用的范围。
-
@Thomas 对此感到抱歉。我正在想办法撤消关闭。
-
@Thomas 请接受我的道歉。看起来没有办法撤消关闭。 meta.stackexchange.com/questions/915/… 但他们表示将在几天内淡出退出投票
标签: c++ c++11 constructor virtual-functions virtual-inheritance