※ 引述《PythonScript (Python)》之铭言:
: 以我目前的理解 有错再请提点
: 有 classA, classB 与 classC
: classB 会产生 classA 的物件, 然后存在 classB 的属性中
: 接着 classC 会去存取 classB, 也会使用 classB 中存 classA 的属性
class B : public A
表示 B is an A
属性一般是指property跟field
B的物件模型会包含A 但这个陈述不代表B可以存取A的所有内容
A对外承诺的"接口" 继承A的B也同样要维持相同的承诺
因此如果B物件在同样的场合无法替代A的行为 会说是违反里氏替换原则
: 如果在 classB 中 classA objectA;
: 未来某个时刻有可能会发生 classC 存取 classB 中存 classA 的属性时
: 该属性可能会消失或被取代
class A的东西不会被弄消失 除非是virtual inheritance打从一开始就不存在
class A的接口如果是virtual, derived class可以override
class A的接口如果是non-virtual, derived class可以hide A的method(然而并不建议)
: 如果在 classB 中 classA* objectA = new objectA()
: 就不会有上述描述情况的发生
: 可以这样理解吗?
完全无关的两个问题
: 其次就是 如果有个变量 variableA
: 我有用指标变量 pointerA 指向 variableA
: 这样 variableA 应该是不会消失 直到我 delete 他
A* ptr = nullptr;
{
A a;
ptr = &a;
}
A& ra = *ptr;
在这个陈述中只有一个问题
variable A的生命周期如何被决定?
上面这段程式码,对ptr dereference绝对是错的,因为 a 早就已经解构
delete与destruct是不同的事情
: 那如果有一系列的 variableA 变量指向它们
: 我把它们整理成一个 vectorB
: vectorB = vector<pointerA>
: 如果怕 vectorB 弄丢 那需要再用一个 pointerB 指向 vectorB 吗?
: 谢谢
同理,
vector<A*>里面所有的raw pointer指向的物件都是没有保证的
就像推文里讲的 unique、shared、weak 是你要先搞懂的东西
vectorB若是一堆pointer所组成
除非这个vector的size非常可观、用户电脑非常烂
直接复制即可, 80:20法则
总结
1. C++基础需要加强
2. pointer的对象有可能是无效的
3. pointer不是万灵丹,shared_ptr乱用只会更惨