有人可以解释一下 C++ 中的私有/受保护继承到底是为了什么,以及它打算解决什么问题?
class Bar { };
class Foo : private Bar { };
我已经看过这个问题,但我仍然不明白它是什么,更不用说什么时候应该使用它了。
(与 Java/C# 或类似语言中的功能进行比较也可能会有所帮助。)
有人可以解释一下 C++ 中的私有/受保护继承到底是为了什么,以及它打算解决什么问题?
class Bar { };
class Foo : private Bar { };
我已经看过这个问题,但我仍然不明白它是什么,更不用说什么时候应该使用它了。
(与 Java/C# 或类似语言中的功能进行比较也可能会有所帮助。)
私有继承模型是“按条款实现的”。含义类似于“has-a”。区别在于:
使用私有继承,您无需编写包装器(适合懒惰的程序员)
“has-a”允许您更好地控制,您可以只公开接口的子集或更改方法名称,如果您愿意。
私有继承使异常安全变得困难,请查看异常 C++ 以获取更多信息
当您想使用基类的受保护成员时,您确实需要私有继承。
有时在 mix-in 类中使用私有继承(有效的 c++ 内存管理章节)
我个人的偏好是将“has-a”用于一般目的,我在排除其他选项后使用私有继承。
要了解私有继承,首先必须了解公共继承。
如果您有以下情况:
class Base
{
public:
void SomeFunc();
};
class Pub : public class Base {};
这意味着允许执行以下操作:
Pub aPub;
Base &basePart = aPub;
您可以获取派生类并获取对基类的引用(或指针)。你也可以这样做:
Pub aPub;
aPub.SomeFunc();
在 中公开的Base
是在 中公开的Pub
。
公共继承意味着每个人、任何地方都可以访问驱动类的基类组件。
私有继承有点不同:
class Priv : private class Base {};
Priv aPriv;
Base &basePart = aPriv;
最后一行通常不起作用。私有继承意味着唯一可以执行此操作的函数和类是 的直接成员Priv
或朋友Priv
。如果您在成员或朋友之外编写此代码Priv
,它将无法编译。
相似地:
Priv aPriv;
aPriv.SomeFunc();
仅当这是在 的成员或朋友中时才有效Priv
。
私有继承意味着只有派生类的成员或朋友才能访问基类组件。所以成员函数可以调用派生类的基类部分,但外界没有人可以。
当您公开从另一个类派生一个类时,您是在说派生类“是”基类。它正是其中一种类型。当您私下从基类派生时,您就是在向外界隐藏派生。这意味着您正在使用基类中的实现来实现派生类,但没有其他人需要知道它。派生类是“根据”基类实现的。
私有继承是实现类组合的一种方式。此 C++ FAQ 有一整章关于此主题,请参阅http://www.parashift.com/c++-faq-lite/private-inheritance.html。
它不能解决问题,但它允许你有更多的代码设计选项,在这种情况下,所有方法Bar
都是私有的Foo
。