私人与公共继承

时间:2010-01-16 05:33:37

标签: oop private public

我有一个基于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中引用的私有继承有什么特别之处。不会用公共继承取代私人继承权工作就可以达到这个目的吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:1)

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

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