有人可以解释一下C ++中私有/受保护的继承是什么,以及它要解决的问题是什么?
class Bar { };
class Foo : private Bar { };
我已经看过this question,但我仍然不明白是什么,更何况我应该使用它。
(与Java / C#或类似语言中的功能比较也可能有所帮助。)
答案 0 :(得分:5)
私有继承模型“是以实现的方式实现的”。意思类似于“has-a”。不同之处是:
使用私有继承,您不需要编写包装器(适合懒惰的程序员)
“has -a”允许您更好地控制,如果您愿意,可以只公开接口的子集或更改方法名称。
私有继承使异常安全变得困难,请查看特殊的c ++以获取更多信息
当您想要使用基类的受保护成员时,您确实需要私有继承。
有时在混合类中使用私有继承(有效的c ++内存管理章节)
我个人偏好使用“has-a”作为一般用途,我在排除其他选项后立即使用私有继承。
答案 1 :(得分:2)
要了解私有继承,您必须首先了解 public 继承。
如果您有以下内容:
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
的成员或朋友中有效。
私有继承意味着派生类的只有成员或朋友才能访问基类组件。因此,成员函数可以调用派生类的基类部分,但外部世界中没有人可以。
当你从另一个类公开派生一个类时,你会说派生类“是一个”基类。它正是这些类型中的一种。当您私有地从基类派生时,您隐藏了来自外部世界的派生。这意味着您在基类中使用实现来实现派生类,但是没有其他人需要知道它。派生类是“基于”基类实现的。
答案 2 :(得分:1)
私有继承是实现类组合的一种方式。这个C ++ FAQ有一整章关于这个主题,请参阅http://www.parashift.com/c++-faq-lite/private-inheritance.html。
答案 3 :(得分:0)
它不能解决问题,但它允许您提供更多代码设计选项,在这种情况下,Bar
中的所有方法都是Foo
中的私有方法。