在哪些情况下我们需要保护继承?

时间:2012-03-31 22:10:02

标签: c++ inheritance

关于公共和私人继承是明确的,但受保护的是什么?任何我们真正需要使用它的例子都会给我们带来好处吗?

4 个答案:

答案 0 :(得分:4)

  

受保护的继承是我今天无法理解的含义。

这是Scott Meyers关于受保护继承的意见(Effective C ++,3rd Edition):)。

但是,这个页面很有趣:Effective C++: discouraging protected inheritance?

答案 1 :(得分:3)

base-from-member习语有时需要受保护的继承。

成语解决的问题如下:您有时需要使用派生类的成员初始化基类,例如

struct foo
{
    virtual ~foo() {}

protected:
    foo(std::ostream& os)
    {
        os << "Hello !\n";
    }
};

struct bar : foo
{
    bar(const char* filename)
      : foo(file), file(filename) // Bad, file is used uninitialized
    {}

private:
    std::fstream file;
};

file是在 foo之后构建的,因此传递给ostream的{​​{1}}无效。

您可以使用辅助类和私有继承来解决此问题:

foo::foo

现在在struct bar_base { std::fstream file; protected: bar_base(const char* filename) : file(filename) {} ~bar_base() {} }; struct bar : private bar_base, public foo { bar(const char* filename) : bar_base(filename), foo(file) {} }; 之前构建bar_base,并且传递给foo的{​​{1}}有效。

如果您希望ostream成为foo::foo的受保护成员,则必须使用受保护的继承:

file

答案 2 :(得分:2)

protected表示可以从子类访问成员变量,但不能从外部访问。

一个非常简单的示例可能是使用变量(比如x)来进行一些内部计算的类。如果子类需要进行相同的计算,则可能需要访问x。将其设为私有将避免子类访问它,使其公开将使每个人都可以访问它。受保护就像是一种权衡。

答案 3 :(得分:0)

受保护对抽象超类特别有用,这些超类是在考虑到孩子的知识的情况下编写的。受保护的成员和方法可供子项使用,并且可以保存代码复制,而不会将它们暴露给当时正在实现的类族之外的世界。