基类指针指向派生类应该是不安全的吧》如果基类真的仅仅指向基类的对象

来源:百度知道 编辑:UC知道 时间:2024/09/23 11:24:29
如果基类指针类型指向的是派生类对象的话,这有转换过来应该是安全的,可是如果像上面那样基类指针类型指向的是基类对象,这有说是不安全,我认为好像不可以的,可是编译连接还是可以通过啊
这是msdn实例
class B { ... };

class D : public B { ... };

void f(B* pb, D* pd)
{
D* pd2 = static_cast<D*>(pb); // not safe, pb may
// point to just B

B* pb2 = static_cast<B*>(pd); // safe conversion
...
}

说法上首先纠正,基类指针指向派生类对象

其次,对于派生类是从基类继承过来的,所以派生类是属于基类的,就比如基类:车,派生类:小汽车,你把车类型的指针指向小汽车当然没问题了
还有,基类类型指针就算知道派生类后,也不存在安全问题,因为指针是基类类型,所以只能调用基类中的方法(当然虚函数例外),你一调用派生类成员方法就会编译报错,所以不会出现运行期错误,所以是安全的
汗,贴主,你题目的意思和正文意思相反啊(你这是派生类指针指向基类对象)。 。 。害我说这么堆话。 。
注意了,你使用的是static_cast转换,这个是编译期的类型转换,只要你不非法调用派生类中的方法就不会出问题,建议使用dynamic_cast,你就会发现这个转换是非法报错的

如果pb仅是基类指针,那麼转换成派生类指针是不安全的.

不一定会崩溃.(如果你不操作派生类的成员,仅操作及类的数据或者函数)
操作了就一定会崩溃

编译连接还是可以通过啊
这个只是做语法检查,语法过了而已,不保证能够正常运行

编译通过又不会说明什么 程序异常退出是常有的事 哪个不是编译过了呢
基类指针指向派生是安全的 反过来是不安全的 但是也是可以通过编译的代码不也有说吗 not safa pb may 可以但是不安全