// 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
4
8
4
为什么会这样?基类的私有数据成员不会继承到派生类中,那么为什么我得到8个字节,派生的大小和o1?
答案 0 :(得分:9)
私人会员是继承的。你无法从派生类中访问它们。
答案 1 :(得分:3)
私有成员实际上在派生类中,它们在派生类中是不可访问的。 private关键字是为了防止从基类派生的程序员更改值,基类的设计者不希望您更改它,因为它可能会改变基类的功能。
在这里查看更深入的解释
答案 2 :(得分: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
也是如此。
derived
对象可以作为A
对象在内存中布局,后跟B
对象,后跟int
,这意味着它是三个序列{ {1}}秒。基类成员是公共成员还是私有成员不会影响它。
答案 3 :(得分:1)
当然它们是继承的 - 毕竟,基类的行为可能取决于它们在那里 - 它们只是无法访问!
答案 4 :(得分:0)
基类的继承方法仍然可以使用私有成员。他们必须在那里。