考虑以下代码,其中Base类构造函数通过Derived类构造函数初始化。当我尝试从x
访问基类值main
时,它返回0而不是5.我的理解有什么问题?
#include <iostream>
using namespace std;
class Base
{
public:
int x;
Base() {}
Base(int a)
{
x = a;
}
};
class Der:public Base
{
public:
Der(int y) : Base(y)
{
x = y;
}
};
int main()
{
Base *ob1 = new Base();
Der *ob = new Der(5);
cout << ob1->x;
return 0;
}
答案 0 :(得分:0)
当您调用new Base()
时,您将从默认构造函数中获取一个对象。这恰好不会初始化x
,因此您的代码具有未定义的行为。你这次碰巧看到了0
,但这并不能保证。
当您致电new Der(5)
时,您会获得一个不同的对象,该对象使用int
构造函数。在您的情况下,在x = y
内设置Der(int)
是不必要的,因为您已经调用了Base(y)
。以下行应输出5
:
cout << ob->x;
另请注意,在此示例中没有理由使用动态分配。使用堆栈是完全可以的:
int main()
{
Base base;
Der derived(5);
cout << "Base (undefined behaviour): " << base.x << endl;
cout << "Derived (defined): " << derived.x << endl;
return 0;
}