基类的私有成员是否始终在C++的派生类中继承?

问题描述:

无论您如何继承基类(私有或受保护或公共),我都会发现无处不在基类的私有成员永远不会继承于派生类中。基类的私有成员是否始终在C++的派生类中继承?

但下面的问题让我很困惑。我不知道为什么这个程序的输出是80.它应该是1个字节(这是C++中空类的大小),因为私有成员永远不会被继承。

#include<iostream> 
using namespace std; 

class base 
{ 
    int arr[10]; 
}; 

class b1: public base { }; 

class b2: public base { }; 

class derived: public b1, public b2 {}; 

int main(void) 
{ 
    cout << sizeof(derived); 
    return 0; 
} 
+8

您看到了错误的。基类中的所有内容都由派生类型继承。 – juanchopanza 2014-10-02 12:58:02

+9

私有成员在派生类中是继承的,但不是* visible *。 – 2014-10-02 12:59:24

+0

“基类中的所有东西都是派生类型继承的”我会说:所有基类**中的所有东西都被派生类型继承。这就是为什么你有80个字节 - sizeof(b1)+ sizeof(b2) – borisbn 2014-10-02 13:06:12

这主要是语义和什么不同的人指的是与继承的问题。当类型D继承自B类型时,每个D对象包含一个完整的B对象。从这个角度来看,所有的成员都是那里有(有的人把这称为继承了)。另一方面,这些成员不是易于获得D的成员,并从这一角度来看,成员好像他们不在那里(有些人称这个没有继承)。一个基地(不管是什么无障碍环境)的

私有成员都是从派生类型(假设没有友谊关系)访问,但它们的存在,派生类型的对象包含基本类型的对象。

+0

也注意到派生类可以覆盖声明为虚拟的基类的私有成员函数。派生类不能调用这些成员函数的基本版本,但可以覆盖它们。在这个意义上,派生类继承基类的私有接口。 – YoungJohn 2014-10-02 14:16:22

是的,派生类继承其所有基类的成员。

私人,公共和受保护的关键字仅影响其应用于的项目的可访问性。如果在特定的上下文中无法访问某些内容,并且您尝试使用它,则编译器会给您一个错误。