私人与公共继承
在部分问题 http://www.parashift.com/c%2B%2B-faq-lite/private-inheritance.html#faq-24.3 提到以下几点:
一个合法的,长期使用的私有继承是当你想要构建一个在类Wilma中使用代码的类Fred,并且来自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();
}
}
它打印
巴尼;弗雷德呼唤威尔玛; Wilma呼叫Fred
那么,在C++ faq lite中引用的私有继承有什么特别之处。不会用公有继承来代替私有继承工作就可以很好地实现这个结果吗?
公共继承使基类可以被外部世界访问。例如,一个指向派生类的指针可以被转换(隐含地,不会少于)一个指向基类的指针。考虑从链接列表派生的堆栈。您通常不希望有人隐式地将您的数组转换为其基本链接列表,这将允许他们执行堆栈不允许的操作,例如在中间插入或删除项目。
归因于私有继承的通常含义是“以......实现” - 这意味着我们通常不希望允许外部世界/用户看到/了解/关心这个类有一个基础的事实类。公共继承应该遵循Liskov替代规则,该规则规定派生类可以在公共基类被调用的任何地方被替换。对于私有继承,我们并不是说派生类可以替代基类。
公有继承是一种设计技术。它的目的是让你正在编写的代码被其他代码所使用,这些代码已经知道如何使用基类提供的接口。
私有继承是一种实现技术。其目的仅仅是通过使用基类的代码来简化你的实现。
是的,你是对的。引用的段落只是引用了子类可以访问隐藏类的私有成员,以及可能的用例。
有些人错误地认为你不能访问继承类的私有成员。
你说“错误地认为你不能访问继承类的私有成员”。但是,在任何类型的继承(public,private或protected)中,基类的私有成员不能由派生类访问。不是吗? – Santhosh 2010-01-16 07:36:01
如果一个类嵌套在另一个类中,则内部类可以从外部类继承,并且还可以访问其公共成员(允许独立于继承的访问)。 – supercat 2011-01-01 17:41:15