【发布时间】:2014-08-29 05:12:24
【问题描述】:
代码:
#include <iostream>
using std::cout;
using std::endl;
struct A
{
virtual void foo()
{
cout << "A" << endl;
}
A(){ }
};
struct B : A
{
B();
virtual void foo()
{
cout << "B" << endl;
}
};
B b;
B::B()
{
b.foo();
foo();
}
struct C : B
{
virtual void foo()
{
cout << "C" << endl;
}
C() : B(){ }
};
C c;
int main(){ }
当一个虚函数被直接或间接调用时 构造函数或析构函数,包括在构造过程中或 销毁类的非静态数据成员和对象 调用适用的是对象(称为 x) 下 构造或破坏,调用的函数是最终的 构造函数或析构函数类中的覆盖器,而不是一个 在派生更多的类中覆盖它。如果虚函数调用 使用显式类成员访问 (5.2.5) 和 对象 表达式指的是 x 的完整对象或其中之一 对象的基类子对象,但不是 x 或其基类之一 子对象,行为未定义。
我一直在尝试收到 UB
如果虚函数调用使用显式类成员访问 (5.2.5) 和对象表达式是指 x 的完整对象 [...]
不清楚什么是x的完整对象,其中x是一个对象。和x类型的完整对象一样吗?
【问题讨论】:
-
您希望 B 构造函数调用重写的 C foo 函数吗?
-
您希望如何识别 UB?结果可以是任何东西,包括伪装成非 UB。
标签: c++