#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class CAnimal
{
public:
virtual void Func() {}
};
class CCat :public CAnimal
{
public:
virtual void Func() {}
void Ftt() {}
};
void test()
{
CAnimal *a = new CAnimal;
CCat *c = dynamic_cast<CCat*>(a);
a->Ftt();
}
void main()
{
test();
system("pause");
return EXIT_SUCCESS;
}
这里编译器认为你是多态:即父类指针指向子类对象,并且子类重写父类的virtual方法
这里是父类指针指向父类对象,再下行。
dynamic_cast认为你写的是父类指针指向子类对象,所以不会报错。
但是运行的时候会炸。
void test01()
{
A *a1 = new A;
B *b1 = dynamic_cast<B*>(a1);
A *a2 = new B;
B* b2 = dynamic_cast<B*>(a2);
cout << b1 << endl;
cout << b2 << endl;
}
这里 b1 = 0;
炸的原因是操作空指针。这里需要说明的是,如果访问非虚函数不一定会炸,因为类对象的成员变量和成员函数是分开的,取非虚函数只需要在非虚函数的形参里加this指针,如果非虚函数里不操作不会炸。
但是虚函数要根据ptr去找虚函数表,这样是必须操作类对象的地址的。
((void(*)())(*(long *)*(long *)&b1))();
本文探讨了dynamic_cast在处理多态类型转换时的注意事项。当父类指针指向子类对象并调用虚函数时,dynamic_cast能够正确运行。但如果指针为空或者误用,可能会导致运行时错误。动态转换非虚函数可能不会立即引发问题,但涉及虚函数时,由于需要查找虚函数表,空指针操作将导致程序崩溃。
1062

被折叠的 条评论
为什么被折叠?



