gpt4 book ai didi

C++ 继承 : confused with base member access from derived object

转载 作者:太空宇宙 更新时间:2023-11-04 16:07:27 25 4
gpt4 key购买 nike

声明:

class base{
public:
base(){a=0;}
base(int a);
int getA();
virtual ~base() ;
protected:
int a ;
};
//
class derived : public base {
public:
derived(){}
derived(int a, int b) ;
int getC() ;
~derived();
private:
int c ;
};

定义:

base::base(int a){
cout << " in base constructor a = " << a << endl ;
a = a ;
}
base::~base(){
a = 0 ;
}
int base::getA(){
return a ;
}
//
derived::derived(int a, int b)
:base(a)
{
c = a+b ;
}
int derived::getC()
{
return c ;
}
derived::~derived(){
c = 0 ;
}

调用:

derived A(4,5) ;
cout << " a of A = " << A.getA() << "\n" ;
cout << " c of A = " << A.getC() << "\n" ;

结果:

in base constructor a = 4
a of A = 4205648
c of A = 9

请有人解释为什么我得到这个结果而不是:

a of A = 4 

?为什么 base member 的值会发生变化?根据我对c++继承的了解,当我们创建一个派生类的对象时,这个对象会继承基类的所有成员和成员函数,为什么对象A的成员a > of class derived 在派生类定义之外失去了它的值(value)?

谢谢!

最佳答案

base::base(int a){
cout << " in base constructor a = " << a << endl ;
a = a ;
}

这一行改变了构造函数参数a的值,而不是basea的值。会更好

base::base(int _a){
cout << " in base constructor a = " << _a << endl ;
a = _a ;
}

更好的是使用构造函数初始化列表:

base::base(int _a): a(_a) {
cout << " in base constructor a = " << a << endl ;
}

在后一种情况下你甚至可以写

base::base(int a): a(a) {
cout << " in base constructor a = " << a << endl ;
}

因为在初始化列表中没有歧义,尽管我仍然更喜欢显式的并且对构造函数参数和类成员使用不同的名称。

关于C++ 继承 : confused with base member access from derived object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33100405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com