继承和私人成员

Inheritance and private members

本文关键字:成员 继承      更新时间:2023-10-16
#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的实例中,bd可能在内存中彼此相邻(尽管编译器可能会选择以不同的方式放置变量(。Derv中的成员函数看不到b,但如果调用从Base继承的函数,则该函数将能够看到b

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

此外,正如Tomalak所指出的,每个Derived对象都包含一个完全构造的Base对象、私有成员和所有。如果Base派生自另一个类——比方说CommonBase——那么每个Derived对象也将包含一个完全构造的CommonBase对象。

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

这有道理吗?