虽然我发现需要私有继承的罕见情况,但我从未遇到过需要 protected 继承的情况。有人有例子吗?
答案 0 :(得分:13)
这里的人似乎误认为受保护的类继承和受保护的方法。
FWIW,我从未见过有人使用受保护的类继承,如果我没记错,我认为Stroustrup甚至认为“受保护”级别是c ++中的错误。如果你删除了这个保护级别并且只依赖公共和私人,那么你就无法做到这一点。
答案 1 :(得分:5)
有一个非常罕见的受保护继承用例。这是您想要使用covariance:
的地方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";
答案 2 :(得分:1)
C++ FAQ Lite提到使用私有继承是合法解决方案的情况(参见[24.3.] Which should I prefer: composition or private inheritance?)。当你想通过虚函数(在这种情况下是derivedFunction()
)从私有基类中调用派生类时:
class SomeImplementationClass
{
protected:
void service() {
derivedFunction();
}
virtual void derivedFunction() = 0;
// virtual destructor etc
};
class Derived : private SomeImplementationClass
{
void someFunction() {
service();
}
virtual void derivedFunction() {
// ...
}
// ...
};
现在,如果你想从Derived类派生,并且你想在派生类中使用Base::service()
(比如你想将Derived::someFunction()
移动到派生类),最简单的方法是完成此操作是将Base
的私有继承更改为受保护的继承。