继承和私有成员

时间:2011-05-29 17:15:08

标签: c++

#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:此问题包含一个误解,在答案中已完全解决。

2 个答案:

答案 0 :(得分:4)

私人会员 继承;它们不是来自子类中成员函数的可见。因此,在Derv的实例中,bd可能在内存中彼此相邻(尽管编译器可能选择以不同方式放置变量)。 Derv中的成员函数无法看到b,但如果您调用的函数继承自Base,则该函数将能够看到b

答案 1 :(得分:1)

我不确定你要问的是什么,但每当调用派生类的构造函数时,它首先调用其父类的构造函数。请注意, private 变量仅对从类(及其朋友)之外的方法访问时是私有的。无论如何调用Base类的构造函数,它都可以访问自己的私有成员变量 b 。换句话说,Derv无法直接访问 b ,但可以调用Base构造函数来修改 b

此外,正如Tomalak指出的那样,每个Derived对象都包含一个完全构造的Base对象,私有成员和所有。如果Base来自另一个类 - CommonBase,那么我们说 - 每个Derived对象也会包含一个完整构造的CommonBase对象。

为了彻底,请注意,除非您明确指定,否则派生类也会隐式调用其父类的默认构造函数

这有意义吗?