2011-05-29 158 views
2
#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 

由于基类的私有成员不继承,什么是内存位置基本构造是创建私有会员在?

注意:这个问题包含一个误解,这是完全解决了答案。

回答

4

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

+0

谢谢,这澄清了我的疑问。非常感谢。 – irappa 2011-05-29 17:28:13

+1

+1:但不能保证'b'和'd'将**相邻** – 6502 2011-05-29 17:44:54

+0

@ 6502:True;我细化了我的答案。 +1。 – 2011-05-29 17:47:15

1

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

此外,由于托默勒格指出,每一个Derived对象包含一个完全构建Base对象,私有成员和所有。如果Base来自另一个类CommonBase,假设每个Derived对象也包含一个完全构造的CommonBase对象。

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

这有道理吗?

+0

我知道派生类constroctor首先调用它的基类构造函数。但是,在这里,因为基类构造函数正在初始化私人成员..在这里这个私人成员居住。无论如何,这是不能继承的。 – irappa 2011-05-29 17:26:10

+1

@irappa:是的。部分Derived对象是一个完全构造的Base对象,私有成员和所有对象。 – 2011-05-29 17:28:39