题
正是它与technical point of view
的意思是,我明白,这意味着我的derived class
总是可以被转换成base class
,仅此而已?我看了一些材料,没有任何参考的技术方面,只有理念!由于事先
解决方案
这意味着我的派生类可以总是被转换为基类的
实际上它意味着比这更好。 int
总是可以被转换为float
,但是,这并不意味着一个int“是一个”浮动。它只是意味着一个浮体可以从int构造。同样可以具有用户定义的类,转换,但是没有其他的关系。
通过继承,指针或参考派生类可以总是被转换为一指针或引用的基类[*]。也就是说,派生类的对象可以在原地站了基类的一个对象。它实际上是其中的一件事情。如果一个人能在脑外科医生的立场,那么他们是脑外科医生。
如果“是”一个正式的定义是里氏巴巴拉的替代原则。这固然仍是哲学,但它是非常完善的理念,它直接关系到你如何编写程序。
您在C ++中使用继承时,要保持伸直的另一件事是运行时多态性(使用virtual
功能实现)和静态多态性(这实际上并不在所有需要继承)之间的差异。对于非虚函数调用,调用的函数的版本总是在类中定义的版本,编译器被告知对象具有(静态类型)。这可能不是真正正常工作,如果在派生类的重载。与虚拟呼叫,被叫的版本是在类中的对象实际上是(动态型)中定义的版本。这是必须决定哪两种的“是”你的目标了。
[*]和对象是通过指针,即有效地访问。您随时可以要挟指针类型与reinterpret_cast
,但是这不是我的意思在这里。还有一些繁琐的细节 - 如果基类是不明确的,你不能转换指针一气呵成,但你可以把它明确地用几个明确的强制转换做。如果基类是无法访问的,那么你的可以的转换,但只能用C风格的演员,不含蓄。在C样式转换的作用就像它忽略了无障碍设施,而不是像static_cast
一个reinterpret_class
。所以,你得到一个工作指针,但希望也强烈地感觉到,你正在做的事情非常错误的; - )
其他提示
一个派生类可以在给定的点R被转换为仅可访问的和明确的基类没有引用的缺乏和其他什么地方比C ++标准本身。
$ 10.2良好的参考:A衍生 类本身可用作基类 受访问控制;见11.2。一种 指针指向一个派生类可以是 隐式转换为指针 无障碍明确的基类 (4.10)。一个派生类的左值 型可以被绑定到一个参考 访问明确的基类 (8.5.3)。末端纸币]
和再
$ 10.3 - “的基符列表 指定的基类的类型 子对象包含在一个对象 派生类型。[..]这里, 类Derived2的对象将有一个 类的子对象派生这在 又将有类的子对象 基。[...]
在的OOAD原则方面:
我个人建议罗伯特·马丁的文章,获取有关这个特别的OCP原则得到良好的保持。这是我不可能击败清晰和权威与作者解释了这些传奇OOAD指南
也期待在LSP作为在@Steves'后解释