继承和私人成员
Inheritance and private members
#include<iostream>
using namespace std;
class Base {
private:
int b;
public:
Base(int bvalue=0) {
b = bvalue;
cout << "B's ctor" << endl;
}
~Base() { }
};
class Derv : public Base {
public:
int d;
Derv(int bval, int dval) : Base(bval),d(dval) {
cout << "D's ctor" << endl;
}
Derv(int dval) : d(dval) {
cout << "D's ctor " << endl;
}
};
int main(){
Derv D1(4,5);
Derv D2(100);
return 0;
}
上面的程序编译得很好,我看到的输出是
B's ctor
D's ctor
B's ctor
D's ctor
由于基类的私有成员不是继承的,所以基类构造函数创建私有成员的内存位置是什么?
注意:这个问题包含一个误解,答案中对此进行了充分说明。
私有成员被继承;它们只是在子类中的成员函数中不可见。因此,在Derv
的实例中,b
和d
可能在内存中彼此相邻(尽管编译器可能会选择以不同的方式放置变量(。Derv
中的成员函数看不到b
,但如果调用从Base
继承的函数,则该函数将能够看到b
。
我不确定你想问什么,但每当调用派生类的构造函数时,它都会首先调用其父类的构造函数。请注意,private变量仅对类(及其友元(之外的方法的访问是私有的。无论Base
类的构造函数是如何调用的,它都可以访问自己的私有成员变量b。换句话说,Derv
不能直接访问b,但它可以调用Base
构造函数为其修改b。
此外,正如Tomalak所指出的,每个Derived
对象都包含一个完全构造的Base
对象、私有成员和所有。如果Base
派生自另一个类——比方说CommonBase
——那么每个Derived
对象也将包含一个完全构造的CommonBase
对象。
为了彻底起见,请注意,除非您明确指定,否则派生类也将隐式调用其父类的默认构造函数。
这有道理吗?
相关文章:
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何从另一个文件继承私有成员变量和公共函数
- C++继承更改成员
- 继承和友元函数,从基类访问受保护的成员
- 删除C++继承中虚拟类成员的代码重复
- 成员包含其他继承类的继承类?
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- enable_if继承的成员函数的名称查找错误
- 初始化依赖于子类的继承类的常量类成员
- 继承:调用基类的成员和方法
- 类设计:类成员继承自同一基类
- 使用 CRTP 进行选择性静态成员继承
- 具有'using'的模板模板成员继承
- 结构绑定:与公共数据成员(继承的基类)结合
- 为什么C++继承不允许基类的公共成员继承到派生类的私有成员?
- 静态成员继承和保护
- 是否可以检查是否为类定义了成员函数,即使该成员继承自未知基类
- 混合模板/非模板继承分类和成员继承