通过成员访问表达式调用虚函数

时间:2015-06-17 04:36:56

标签: c++ base-class

我来了以下规则N4296::12.7/4 [class.cdtor]

  

如果虚函数调用使用显式类成员访问   (5.2.5)和对象表达式是指x的完整对象   或该对象的基类子对象之一,但不是x或其中一个   基类子对象,行为未定义。

这是什么意思?难道你不能用一个例子来解释它吗?这对我来说有点难以想象。

1 个答案:

答案 0 :(得分:0)

如果您仍然想知道,这指的是当您在基类的析构函数中并且您引用已经被销毁的整个对象的东西时。一个例子:

struct Derived;

struct Base {
    Derived &der;
    Base(Derived &d): der(d) {}
    ~Base();
};

struct Derived: Base {
    int value;
    Derived(): Base(*this) {}
};

#include <iostream>

Base::~Base() {
    std::cout <<
        der.value // this is the undefined behavior! der.value is *gone*
        << std::endl;
}

AFAIK,该代码中的所有内容都是合法的,除了在der.value的析构函数中访问Base,因为当您正在销毁Base时,您已经销毁了Derived你保留了der

中的引用