【问题标题】:private vs public inheritance私有与公共继承
【发布时间】:2011-01-05 18:53:14
【问题描述】:

我有一个基于this问题的问题

在该部分 http://www.parashift.com/c%2B%2B-faq-lite/private-inheritance.html#faq-24.3 提到以下内容:

当您想要构建一个使用 Wilma 类中的代码的类 Fred 时,一个合法的、长期的私有继承用途,而 Wilma 类的代码需要调用新类 Fred 的成员函数。在这种情况下,Fred 调用 Wilma 中的非虚函数,而 Wilma 调用自身(通常是纯虚函数),它们被 Fred 覆盖。这将更难与组合。

但是,我想知道为什么使用公共继承不会达到同样的效果。 即下面的 c# 代码做同样的事情..

class Wilma
{
    protected void FredCallsWilma() {
        Console.Write("Fred Calls Wilma ;");
        WilmaCallsFred();
    }

    protected virtual void WilmaCallsFred() {}
}

class Fred : Wilma
{
    public void barney(){
        Console.Write("barney;");
        FredCallsWilma();
    }

    protected override void WilmaCallsFred(){
        Console.Write("Wilma Calls Fred ;");
    }
}

class Program
{
    static void Main(string[] args){
        Fred f1 = new Fred();
        f1.barney();
    }
}

打印出来

巴尼;弗雷德打电话给威尔玛;威尔玛打电话给弗雷德

那么在 c++ faq lite 中引用的私有继承有什么特别之处。用公共继承代替私有继承会不会很好地达到这个结果?

【问题讨论】:

    标签: oop private public


    【解决方案1】:

    公共继承使外部世界可以访问基类。例如,指向派生类的指针可以转换(隐式地,不少于)为指向基类的指针。考虑一个从链表派生的堆栈。您通常不希望有人将您的数组隐式转换为其基本链表,这将允许他们执行堆栈不允许的操作,例如在中间插入或删除项目。

    归因于私有继承的通常含义是“按照以下方式实现”——这意味着我们通常不希望外部世界/用户看到/知道/关心此类具有基类的事实.公共继承应遵循 Liskov 替换规则,即派生类可以在任何需要公共基类的地方替换。对于私有继承,我们并不是说派生类可以替代基类。

    公共继承是一种设计技术。它的目的是让其他已经知道如何使用基类提供的接口的代码使用您正在编写的代码。

    私有继承是一种实现技术。它的目的只是通过使用基类中的代码来简化您的实现。

    【讨论】:

      【解决方案2】:

      是的,你是对的。引用的段落仅引用子类可以访问继承类的私有成员,以及可能的用例。

      有些人错误地认为您不能访问继承类的私有成员。

      【讨论】:

      • 您说“错误地假设您无法访问继承类的私有成员”。但是,在任何类型的继承(公共、私有或受保护)中,派生类都不能访问基类的私有成员。不是吗?
      • 如果一个类嵌套在另一个类中,则内部类可以继承外部类,也可以访问其公共成员(允许独立于继承的访问)。
      猜你喜欢
      • 1970-01-01
      • 2011-03-11
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      相关资源
      最近更新 更多