【问题标题】:Base class is unitialized while being accessed基类在被访问时被单元化
【发布时间】:2015-10-13 04:30:05
【问题描述】:

以下代码:

#include <iostream>

struct A {
    int a;
    virtual int foo(){ std::cout << "foo()" << std::endl; return 5; }
    A(int a) : a(a){ }
};

struct B : A{
    B() : A(foo()){ }
};

int main()
{
    B b;
}

LIVE DEMO

产生一个警告

warning: base class 'A' is uninitialized when used here to access 'A::foo'

这是否意味着在未初始化时访问基类会产生Undefined Behavior

在我的例子中,A::a 得到了 5 的值,这没关系。

【问题讨论】:

  • 如果foo 访问A 的任何成员变量(现在可能不存在但以后可能存在),那么您可以获得未定义的行为。如果foo变成了一个虚函数,或者调用了一个虚函数,可以得到非常惊人的结果。
  • 当我们将 'a' 设为 A::a 的静态变量时会发生什么?
  • @vishal 程序将不再编译,因为静态成员不能在构造函数初始化列表中列出。
  • 感谢您的知识:)

标签: c++ class initialization


【解决方案1】:

是的,这是未定义的行为 (IIRC),因为 foo 是一个虚拟方法。

如果foo 不是虚拟的,则行为将被定义,但在对象初始化之前调用该方法仍然是一个值得商榷的想法。

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多