C++ 通过派生类构造函数初始化后从main()访问基类变量

C++ 通过派生类构造函数初始化后从main()访问基类变量,c++,C++,考虑以下代码,其中基类构造函数是通过派生类构造函数初始化的。当我试图从main访问基类值x时,它返回0而不是5。我的理解有什么问题 #include <iostream> using namespace std; class Base { public: int x; Base() {} Base(int a) { x = a; } }; class Der:public Base { public: Der(in

考虑以下代码,其中基类构造函数是通过派生类构造函数初始化的。当我试图从
main
访问基类值
x
时,它返回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;
}
#包括
使用名称空间std;
阶级基础
{
公众:
int x;
Base(){}
基本(INTA)
{
x=a;
}
};
类别:公共基地
{
公众:
德(整数y):基数(y)
{
x=y;
}
};
int main()
{
Base*ob1=新的Base();
Der*ob=新的Der(5);
cout x;
返回0;
}

调用
newbase()
时,从默认构造函数中获得一个对象。这恰好根本没有初始化
x
,因此您的代码具有未定义的行为。这次您碰巧看到
0
,但这并不能保证

调用
newder(5)
时,会得到一个不同的对象,它使用
int
构造函数。在您的情况下,在
Der(int)
内设置
x=y
是不必要的,因为您已经调用了
Base(y)
。以下行应输出
5

cout << ob->x;
coutx;
还请注意,在本例中没有理由使用动态分配。使用堆栈完全可以:

int main()
{
    Base base;
    Der derived(5);
    cout << "Base (undefined behaviour): " << base.x << endl;
    cout << "Derived (defined): " << derived.x << endl;
    return 0;
}
intmain()
{
基地;
得率(5);

cout
ob1
ob
是不相关的实例。您的意思可能是
Base*ob1=new Der(5);cout x;
。感谢您的回复。那么我如何从main()访问基类成员呢没有使用派生类对象?我认为您有点困惑。在这两种情况下,您都在访问基类成员。区别在于您的
ob1
实例没有使用值初始化该成员。有一个合适的构造函数可以(
base::base(int)
),只是您没有调用它。