虽然我已经看到罕见的情况 继承权是必要的,我从来没遇到一个情况下 受保护的 继承权是必要的。不会有人有一个例子吗?

有帮助吗?

解决方案

这里的人似乎错误的保护类继承和保护方法。

总的来说,我从来没有见过任何人使用受保护类的遗产,并且如果我没有记错的话我觉得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 受保护的继承权。

对不起,不能认为一个更具体的例子。我个人喜欢让所有的继承的公开,以避免浪费时间"我应该做的继承有关的保护或私人"的讨论。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top