2012-05-24 31 views
1
// inheritence experiment 

#include"stdafx.h" 
#include<iostream> 

using namespace std; 

class base 
{ 
private: 
    int i; 
}; 

class derived: public base 
{ 
private: 
    int j; 
}; 

int main() 
{ 
    cout << endl << sizeof(derived) << endl << sizeof(base); 
    derived o1; 
    base o2; 
    cout << endl << sizeof(o1) << endl << sizeof(o2); 
} 

我得到这样的输出:基类中的私有元素是否添加到派生类的大小?

,为什么是这样呢?基类的私有数据成员不会继承到派生类中,所以为什么我得到两个8字节,派生和o1的大小?

回答

2
class base { 
public: 
    base(int v) : m_value(v) { } 
    int value() { return m_value; } 
private: 
    int m_value; 
}; 

class derived : private base { 
    derived(int v) : base(v) { } 
    int value2() { return value(); } 
}; 

int main() 
{ 
    derived d(2); 
    return d.value2(); 
} 

你怎么能指望这如果私人基类没有保存价值的地方工作?

你选择的词“继承到派生类”让我觉得你对继承的工作方式感到困惑。来自基类的成员不会继承转换成或复制转换成的派生类。派生类包含基类型的实例,作为完整派生对象内的子对象,所以派生类(通常)至少与其基类的总和一样大。

考虑以下代码:

struct A { 
private: 
    int i; 
}; 

struct B { 
    int j; 
}; 

struct derived : A, B { 
    int k; 
}; 

一个A对象在内存中布置作为int,所以是一个B。 A derived对象可以在内存中作为A对象进行布局,然后是B对象,然后是int,这意味着它是一个由三个int组成的序列。基类成员是公有还是私有不会影响到这一点。

9

私人会员是遗传的。你无法从派生类访问它们。

0

基类的继承方法仍然可以使用私有成员。他们必须在那里。

1

当然,他们是继承的 - 毕竟,基类的行为可能取决于他们在那里,他们只是无法访问!

+0

如果你无法访问它们,它们在派生类中的位置是什么? – Ghost

+0

@Ghost:你不能访问它们,但是你的继承函数可能会被访问​​,并且基础中的函数将被访问。 –

+0

他们可以间接访问!正如我写的,基类中的行为(即函数)可能取决于那些私有成员。而这些功能可能是公开的或保护... – ltjax

3

私有成员实际上是在派生类中,它们只是在派生类中不可访问。 private关键字是为了防止派生自基类的程序员改变基类的设计者不想更改的值,因为它可能会改变基类的功能。

看看这里进行更深层次的解释

Fragile base class

相关问题