我有一个基于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中引用的私有继承有什么特别之处呢?用公共继承来代替私人继承不是很好吗,才能达到这样的效果?
发布于 2010-01-16 06:26:48
公共继承使外部世界可以访问基类。例如,指向派生类的指针可以(隐式地)转换为指向基类的指针。考虑从链接列表派生的堆栈。您通常不希望有人将您的数组隐式转换为它的基本链接列表,这将允许他们做一些不允许堆栈的事情,例如插入或删除中间的项。
私有继承的通常含义是“是按”实现的“--这意味着我们通常不想让外部世界/用户看到/知道/关心这个类有基类的事实。公共继承应该遵循Liskov替换规则,该规则规定可以在任何需要公共基类的地方替换派生类。对于私有继承,我们并不是说派生类可以替代基类。
公共继承是一种设计技术。它的目的是允许您正在编写的代码被其他已经知道如何使用基类提供的接口的代码使用。
私有继承是一种实现技术。它的目的只是通过使用基类中的代码来简化您的实现。
发布于 2010-01-16 05:37:41
是的,你是对的。引用的段落只是引用子类可以访问继承类的私有成员,以及这方面的一个可能的用例。
有些人错误地认为您不能访问继承类的私有成员。
https://stackoverflow.com/questions/2076311
复制相似问题