什么是私有继承,它解决了哪些问题
What is private inheritance, and what issues(s) does it address?
谁能解释一下c++中的私有/保护继承到底是为了什么,以及它打算解决什么问题?
class Bar { };
class Foo : private Bar { };
我已经看到了这个问题,但我仍然不明白它是什么,更不用说什么时候应该使用它了。
(与Java/c#或类似语言的特性进行比较也会有所帮助)
私有继承模型"is- implementation -in-terms "。它的意思与"has-a"类似。不同之处在于:
-
使用私有继承,您不需要编写包装器(对于懒惰的程序员来说很好)
-
"has-a"允许你更好的控制,你可以只暴露接口的一个子集,或者如果你喜欢改变方法名。
-
私有继承使得异常安全变得困难,更多信息请看异常c++
-
当你想使用基类中受保护的成员时,你确实需要私有继承。
-
有时私有继承在mix-in类中使用(Effective c++内存管理章节)
我的个人偏好是在一般情况下使用"has-a",我在排除其他选项后才使用私有继承。
要理解私有继承,必须首先理解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
的成员或友元内有效。
私有继承意味着只有派生类的成员或友元才能访问基类组件。所以成员函数可以调用派生类的基类部分,但是外部没有人可以。
当你公开地从另一个类派生出一个类时,你说这个派生类"是"一个基类。这正是其中一种类型。当您私下地从基类派生时,您将对外部世界隐藏派生。这意味着您正在基类中使用实现来实现派生类,但其他人不需要知道它。派生类是根据基类"实现"的。
私有继承是实现类组合的一种方式。
它不能解决问题,但它允许您更多的代码设计选项,在这种情况下,Bar
中的所有方法在Foo
中都是私有的。
- Project Euler问题4的错误解决方案
- 在java中解决这段代码时面临循环中的问题
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 难以理解某些人解决IOI问题的源代码
- 节俭并发:未解决的外部问题
- IpOpt拒绝解决不受约束的问题
- 错误LNK2005无法解决问题的解决方案
- 如何解决g++问题"internal compiler error: Illegal instruction min() _GLIBCXX_USE_NOEXCEPT { return __FLT_MI
- 必须使用尾随返回类型的示例,因为无法用旧方法解决问题
- 如何解决问题"unresolved extenal symbol _DllMainCRTStartup@12"?
- 如何使用OlesetClipboard将我的COM对象放置在剪贴板上时解决问题
- 与C++析构函数相比,C#析构函数和GC并没有真正解决问题
- 没有调用函数,而是使用垃圾值.如何调用函数并解决问题
- 所有的组合算法和解决C++问题的一般方法
- 模板过载解决问题
- 对"pthread_key_create"的未定义引用;参数顺序不能解决问题
- 如何在使用cplex解决问题时设置间隙
- 选择一门语言学习真的很重要吗?他们都使用相似的技术来解决问题
- Iostream解决c++问题
- 递归是一件坏事吗?在递归似乎最有用的地方,是否有更清晰或更有效的方法来解决问题?