C ++继承:与从派生对象访问基本成员混淆
c++ inheritance : confused with base member access from derived object
声明:
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
?为什么基本成员的值会发生变化?根据我在 c++ 中学到的继承知识,当我们创建派生类的对象时,该对象将继承基类的所有成员和成员函数,为什么派生类的对象A
的成员 a 在派生类定义之外丢失了其值?
谢谢!
base::base(int a){
cout << " in base constructor a = " << a << endl ;
a = a ;
}
此行更改构造函数参数的值 a
,而不是 base
的 a
的值。更好的将是
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++ 传递指向对象的指针的指针,无法访问成员
- 从不同C++类的成员变量访问成员函数
- 使用 getter 访问成员变量C++
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- 通过多个类访问成员时出错
- 如何在使用对象指针时访问成员函数
- 为什么相应成员不能正确访问成员函数指针
- 从两个不同类继承的非虚拟基类的访问成员
- 如何使用 gcc 内联汇编器代码访问成员变量
- 如何使用常数向量访问成员函数
- 访问成员函数中参数的类成员
- C++嵌套结构初始化和访问成员
- 通过指向班级第一个成员的指针访问成员是不确定的行为吗?
- 如何使用C STD :: SET中的迭代器访问成员功能
- 访问成员C 时,结构的向量生成了范围的错误
- 带指针的班级访问成员
- 从聚合类访问成员变量
- 如何访问成员变量 sqlite 回调
- ctypes/C++segfault访问成员变量
- 通过父类型的指针或直接从派生类访问成员函数的差异