公有和私有继承是显而易见的,但受保护的是什么?任何例子,当我们真的需要使用它,它使我们受益?在哪些情况下我们需要保护继承?
回答
基于成员的成语有时需要受保护的继承。
该成语地址的问题如下:有时需要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
- 1. 在哪些情况下我们需要指定QMAKE_CXXFLAGS?
- 2. 继承的情况下,类
- 3. 下列情况下需要使用哪些索引
- 4. 在这种情况下需要使用哪些css选择器
- 5. 在哪些情况下需要使用TypeScript的AngularJS工厂?
- 6. 在这种Java情况下需要哪些序列化?
- 7. 在哪些情况下需要远程类加载?
- 8. 使用'承诺'与不使用'承诺':在哪些情况下?
- 9. 在哪些情况下,我需要在rails中使用类和实例方法?
- 10. 在哪种情况下,我们需要创建一个新的线程?
- 11. 在哪些情况下我必须保留一个对象?
- 12. 在哪些情况下我需要锁定同时访问的变量?
- 13. 在什么情况下,我们需要调用GC.Collect两次
- 14. 在什么情况下我们需要使用`multiprocessing.Pool.imap_unordered`?
- 15. 我们是否需要Hibernate映射在这种情况下?
- 16. 我们需要在Android 6.0运行时需要哪些权限
- 17. 如何在某些情况下禁用Django的csrf保护?
- 18. 根据继承使用情况,以下哪项不允许?
- 19. 登录超时:您在哪些情况下使用它们?
- 20. 我在哪些情况下使用这些排序算法?
- 21. 继承在Perl是表示我的情况下,错误
- 22. 在这种情况下,我必须继承吗?
- 23. 在这种情况下我应该使用继承吗?
- 24. 为什么QObject需要成为多继承情况下的第一个
- 25. 继承保护方法
- 26. C++保护成员继承
- 27. 为什么try/catch在某些情况下需要,而不是其他情况?
- 28. 在某些情况下只保存NSManagedContext
- 29. 为什么在某些情况下需要将#放在Lisp中?
- 30. 在哪些情况下调用bind()是必要的?
'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