关于公共和私人继承是明确的,但受保护的是什么?任何我们真正需要使用它的例子都会给我们带来好处吗?
答案 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)
受保护对抽象超类特别有用,这些超类是在考虑到孩子的知识的情况下编写的。受保护的成员和方法可供子项使用,并且可以保存代码复制,而不会将它们暴露给当时正在实现的类族之外的世界。