【问题标题】:Are Private members of base class always inherited in derived class in C++?基类的私有成员是否总是在 C++ 的派生类中继承?
【发布时间】:2014-11-27 11:21:12
【问题描述】:

我曾经到处看到基类的私有成员永远不会在派生类中继承,无论您如何继承基类(私有或受保护或公共)。

但是下面的问题真的让我很困惑。我不知道为什么这个程序的输出是 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;
}

【问题讨论】:

  • 你看错了。基类中的所有内容都由派生类型继承。
  • 私有成员在派生类中被继承,但不可见
  • “来自基类的所有东西都被派生类型继承” 我想说:所有基类中的所有东西都被派生类型继承。这就是为什么你有 80 个字节 - sizeof(b1) + sizeof(b2)
  • 私有成员是派生的,但不能被子类中定义的任何方法访问
  • @MagnusHoff 它们是可见的,但不可访问。它们仍然可以隐藏其他同名声明(例如非成员变量或函数)。

标签: c++ inheritance


【解决方案1】:

这主要是语义问题以及不同的人使用继承指代的问题。当D 类型继承自B 类型时,每个D 对象都包含一个完整 B 对象。从这个角度来看,所有成员都存在(有些人称之为继承)。另一方面,D 的成员无法访问这些成员,从这个角度来看,这些成员就好像他们不在那里一样(有些人称之为 not继承)。

基类的私有成员(无论可访问性如何)不能从派生类型访问(假设没有友谊关系),但它们在那里,派生类型的对象包含基本类型。

【讨论】:

  • 还要注意派生类可以覆盖基类的私有成员函数,这些函数被声明为虚拟。派生类不能调用这些成员函数的基版本,但它可以覆盖它们。从这个意义上说,派生类甚至“继承”了基类的私有接口。
【解决方案2】:

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

关键字 private、public 和 protected 仅影响它们所应用的项目的可访问性。如果某些内容在特定上下文中无法访问并且您尝试使用它,编译器会给您一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2011-02-26
    相关资源
    最近更新 更多