2012-03-31 46 views
6

公有和私有继承是显而易见的,但受保护的是什么?任何例子,当我们真的需要使用它,它使我们受益?在哪些情况下我们需要保护继承?

+0

'giveы':你好来自俄罗斯:) – iehrlich 2012-03-31 22:13:54

+2

相关:保护继承(HTTP://计算器.com/questions/2090661/protected-inheritance) – ipc 2012-03-31 22:16:07

+2

并非C++的每一部分都是有用的。 *定义一个类似于受保护继承的特性是很自然的,因为它适合于一般的方案,但是这并不能使其广泛(或根本)有用。甚至一些*被明确设计的东西都没有用,比如'valarray','export','vector '或异常规范。 – 2012-03-31 22:23:24

回答

3

基于成员的成语有时需要受保护的继承。

该成语地址的问题如下:有时需要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_basefoo之前建造,并传递给foo::fooostream是有效的。

如果你想file成为bar保护成员,必须使用保护继承:

struct bar : protected bar_base, public foo { ... } 
2

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

一个非常简单的例子可能是一个类,它使用一个变量(比如x)来做一些内部计算。如果一个子类需要做相同的计算,可能需要访问x。将它设为私有将避免子类访问它,使其公开将让所有人都能访问它。保护就像一个折衷。

+2

问题是关于受保护的继承,class a:protected b ',而不是保护成员。 – 2012-04-01 08:07:17

0

受保护对抽象的超类特别有用,这些抽象超类是以儿童知识为基础编写的。受保护的成员和方法可供儿童使用,并且可以节省代码复制,而不会将它们暴露给当时正在实施的类族之外的世界。

+2

问题是关于受保护的继承,'class a:protected b',而不是关于受保护的成员。 – 2012-04-01 08:05:26

相关问题