1

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

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 中引用的私有继承有什么特别之处。用公共继承代替私有继承会不会很好地达到这个结果?

4

2 回答 2

4

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

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

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

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

于 2010-01-16T06:26:48.613 回答
1

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

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

于 2010-01-16T05:37:41.770 回答