【问题标题】:c++ derived class with private access specifier具有私有访问说明符的 c++ 派生类
【发布时间】:2013-10-22 01:26:27
【问题描述】:

我有一个来自基类(A 类)的派生类(B 类)。 A 类有一个受保护的虚函数 foo(),我想覆盖它并将其用作派生类中的私有函数。

Class A{
  protected:
   virtual void foo() = 0;
}

我想知道以下是否

Class B: public Class A
  private:
    virtual void foo();

Class B: private Class A
  private:
    virtual void foo();

都是一样的。

【问题讨论】:

  • 你为什么要这样做?

标签: c++ access-specifier


【解决方案1】:

它们不一样。在第一个示例中,B is-an-A,在第二个示例中不是。所以在第一种情况下,你可以有这样的代码

void foo(const A& a);

接受AB 作为参数。使用私有继承,您无法做到这一点。例如,

A a;
B b;
foo(a); // OK with private and public inheritance
foo(b); // OK only with public inheritance, i.e. B is an A.

【讨论】:

  • 我认为在第二种情况下B 也是-an-A,尽管您不能通过A 的引用(或指针)来寻址B 的对象。
  • @MM。我会说它has-an-A,但我意识到可能对此没有共识。
  • @juanchopanza 你能举个例子吗,你知道有什么地方可以更详细地解释这一点吗?我没有完全明白。
  • @AvbAvb 我添加了一个小例子来说明我所指的内容。
【解决方案2】:

不,你的两种情况不一样。

在第二种情况下,class B 不能转换为 class A,因为私有基类是隐藏的。在这方面会得到与class Aclass B 的成员相同的行为。

【讨论】:

    【解决方案3】:

    不,两者都不一样 在公共继承类 A 的 foo() 将是类 B 中的受保护成员 在私有继承中,B 类只能访问 A 类的公共成员,因此 B 类中不会出现 A 类的任何 foo()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 2014-06-18
      • 2018-04-19
      • 2021-11-10
      相关资源
      最近更新 更多