#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
由于Base类的私有成员未被继承,Base构造函数创建私有成员的内存位置是多少?
NB:此问题包含一个误解,在答案中已完全解决。
答案 0 :(得分:4)
私人会员 继承;它们不是来自子类中成员函数的可见。因此,在Derv
的实例中,b
和d
可能在内存中彼此相邻(尽管编译器可能选择以不同方式放置变量)。 Derv
中的成员函数无法看到b
,但如果您调用的函数继承自Base
,则该函数将能够看到b
。
答案 1 :(得分:1)
我不确定你要问的是什么,但每当调用派生类的构造函数时,它首先调用其父类的构造函数。请注意, private 变量仅对从类(及其朋友)之外的方法访问时是私有的。无论如何调用Base
类的构造函数,它都可以访问自己的私有成员变量 b 。换句话说,Derv
无法直接访问 b ,但可以调用Base
构造函数来修改 b 它
此外,正如Tomalak指出的那样,每个Derived
对象都包含一个完全构造的Base
对象,私有成员和所有。如果Base
来自另一个类 - CommonBase
,那么我们说 - 每个Derived
对象也会包含一个完整构造的CommonBase
对象。
为了彻底,请注意,除非您明确指定,否则派生类也会隐式调用其父类的默认构造函数。
这有意义吗?