虽然我已经看到需要私有继承的罕见情况,但我从未遇到过需要保护继承的情况.有人有例子吗?
这里的人似乎错误了Protected class继承和Protected方法.
FWIW,我从未见过有人使用受保护的类继承,如果我没记错,我认为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"函数,无论出于何种原因提供基本及其功能的可控可见性.
但是,它会在struct中失败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";