题
虽然我已经看到罕见的情况 私 继承权是必要的,我从来没遇到一个情况下 受保护的 继承权是必要的。不会有人有一个例子吗?
解决方案
这里的人似乎错误的保护类继承和保护方法。
总的来说,我从来没有见过任何人使用受保护类的遗产,并且如果我没有记错的话我觉得Stroustrup甚至被认为是"受保护"的水平是一个错误在c++。还有珍贵的小你不能这样做,如果删除该保护水平而仅仅依靠公共的和私人的。
其他提示
有一个非常罕见使用的情况下受保护的继承权。这就是你想要使用 差:
struct base {
virtual ~base() {}
virtual base & getBase() = 0;
};
struct d1 : private /* protected */ base {
virtual base & getBase() {
return this;
}
};
struct d2 : private /* protected */ d1 {
virtual d1 & getBase () {
return this;
}
};
前一段试图隐藏它的基础课,并提供控制的可见性的基础和它们的功能,无论出于何种原因,通过提供一个"getBase"的功能。
然而,它将无法在结构 d2
, ,由于 d2
不知道, d1
是来自 base
.因此, covariance
不会的工作。一条出路,这是导他们受到保护,使继承中可见d2。
一个类似的例的使用,这是当你从 std::ostream
, 但不要随机的人要写到你的流。你可以提供一个虚拟的 getStream
功能返回 std::ostream&
.这一职能可以做一些准备的流下操作。例如把某些操纵者。
std::ostream& d2::getStream() {
this->width(10);
return *this;
}
logger.getStream() << "we are padded";
C++常见问题的精简 提到的一个情况下使用私人继承的是一个合法的解决方案(见 [24.3.] 这应该我喜欢:合成物或私人遗产?).就是你想要呼叫派生类从一个私人基类通过一个虚拟的功能(在这种情况下 derivedFunction()
):
class SomeImplementationClass
{
protected:
void service() {
derivedFunction();
}
virtual void derivedFunction() = 0;
// virtual destructor etc
};
class Derived : private SomeImplementationClass
{
void someFunction() {
service();
}
virtual void derivedFunction() {
// ...
}
// ...
};
现在,如果你想要从类衍生的,并且想要使用 Base::service()
从内源类别(说你想要移动 Derived::someFunction()
来源类),最简单的方式完成这一任务是改变私人继承的 Base
受保护的继承权。
对不起,不能认为一个更具体的例子。我个人喜欢让所有的继承的公开,以避免浪费时间"我应该做的继承有关的保护或私人"的讨论。