C++ 在C+;中是否有需要受保护继承的例子+;?

C++ 在C+;中是否有需要受保护继承的例子+;?,c++,oop,inheritance,C++,Oop,Inheritance,虽然我见过极少数需要私有继承的情况,但我从未遇到过需要受保护继承的情况。有人举过一个例子吗?这里的人似乎误解了受保护的类继承和受保护的方法 宽度(10); 归还*这个; } getStream()但这不是海报所问的,他问的是受保护的继承。当然,在某些情况下,你会想要私人继承,尽管不会太多天哪,我会马上修好的!:) struct base { virtual ~base() {} virtual base & getBase() = 0; }; struct d1

虽然我见过极少数需要私有继承的情况,但我从未遇到过需要受保护继承的情况。有人举过一个例子吗?

这里的人似乎误解了受保护的类继承和受保护的方法

<我不曾见过有人使用受保护类继承,如果我记得正确的话,我认为Stroustrup甚至认为“保护”级别是C++中的一个错误。如果你取消了这个保护级别,仅仅依靠公共和私人服务,那么你几乎做不到什么

提到使用私有继承是合法解决方案的情况(请参阅)。当您希望通过虚拟函数(在本例中为
derivedFunction()
)从私有基类中调用派生类时:

现在,如果您希望从派生类派生,并且希望在派生类内使用
Base::service()
(假设您希望将
Derived::someFunction()
移动到派生类),那么实现这一点的最简单方法是将
Base
的私有继承更改为受保护继承


对不起,想不出更具体的例子了。就我个人而言,我喜欢将所有继承公开,以避免浪费时间进行“我应该将继承关系设置为受保护的还是私有的”讨论。

有一个非常罕见的受保护继承用例。这是您想要利用的地方:

前面的代码段试图隐藏它的基类,并通过提供一个“getBase”函数来提供基类及其函数的受控可见性,无论出于何种原因

但是,它将在struct
d2
中失败,因为
d2
不知道
d1
来自
base
。因此,
协方差
将不起作用。解决这个问题的一个方法是派生受保护的对象,以便在d2中可以看到继承

类似的例子是,当您从
std::ostream
派生,但不希望随机的人写入您的流时,也可以使用此方法。您可以提供一个虚拟的
getStream
函数,该函数返回
std::ostream&
。该函数可以为下一个操作对流进行一些准备。例如,将某些操纵器放入

std::ostream& d2::getStream() {
    this->width(10);
    return *this;
}

logger.getStream() << "we are padded";
std::ostream&d2::getStream(){
这个->宽度(10);
归还*这个;
}

getStream()但这不是海报所问的,他问的是受保护的继承。当然,在某些情况下,你会想要私人继承,尽管不会太多天哪,我会马上修好的!:)
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; 
    } 
}; 
std::ostream& d2::getStream() {
    this->width(10);
    return *this;
}

logger.getStream() << "we are padded";