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