在哪些情况下我们需要保护继承?
基于成员的成语有时需要受保护的继承。
该成语地址的问题如下:有时需要foo
后与派生类的一个成员来初始化基类,像在
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
构造,因此ostream
传递给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
之前建造,并传递给foo::foo
的ostream
是有效的。
如果你想file
成为bar
保护成员,必须使用保护继承:
struct bar : protected bar_base, public foo { ... }
protected
表示成员变量可以从子类访问,但不能从外部访问。
一个非常简单的例子可能是一个类,它使用一个变量(比如x
)来做一些内部计算。如果一个子类需要做相同的计算,可能需要访问x
。将它设为私有将避免子类访问它,使其公开将让所有人都能访问它。保护就像一个折衷。
问题是关于受保护的继承,class a:protected b ',而不是保护成员。 – 2012-04-01 08:07:17
受保护的继承是其含义,直到今天仍然没有意义。
这是关于受保护继承:)的Scott Meyers观点(Effective C++,第3版)。
受保护对抽象的超类特别有用,这些抽象超类是以儿童知识为基础编写的。受保护的成员和方法可供儿童使用,并且可以节省代码复制,而不会将它们暴露给当时正在实施的类族之外的世界。
问题是关于受保护的继承,'class a:protected b',而不是关于受保护的成员。 – 2012-04-01 08:05:26
'giveы':你好来自俄罗斯:) – iehrlich 2012-03-31 22:13:54
相关:保护继承(HTTP://计算器.com/questions/2090661/protected-inheritance) – ipc 2012-03-31 22:16:07
并非C++的每一部分都是有用的。 *定义一个类似于受保护继承的特性是很自然的,因为它适合于一般的方案,但是这并不能使其广泛(或根本)有用。甚至一些*被明确设计的东西都没有用,比如'valarray','export','vector'或异常规范。 –
2012-03-31 22:23:24