dynamic_cast 与 一般强制类型转换的却别:①dynamic_cast只能对指针或引用强制转换;②dynamic_cast会进行安全检查。
对于强制类型转换我个人的理解是,强制类型转换只是改变了内存的操作范围,因为对象写入内存中后,要进行强制类型转换时并没有对对象的内存进行重写操作。只是改变了对这块内存的操作范围,比如 int a =1; char b=(int) a; 对a这个4byte的内存空间,b只操作a的最高位1byte。
在多重继承中:
class A{public: virtual void f1();};
class B{public: virtual fvoid 2();}
class C:public A,public B{ public: virtual void f1(); virtual void f2()};
C c; // c中内存分配为 ||||||||-----A虚表指针--A数据成员--B虚表指针--B数据成员--C数据成员------|||||
A *pa=dynamic_cast<A*> c; 将pa指向c中A的虚表指针,
B*pb=dynamic_cast<B*> c; 将pb指向c中B的虚表指针; dynamic_cast 如果转换不成功会返回NULL指针。
--------------------------------------------
父类指针指向子类对象时,当调用虚函数的时候,父类指针指向的其实还是子类对象的内存,只不过这段内存正好是完全继承自父类的!!所以调用非虚函数调用的是父类的。而调用虚函数时 ,虚表指针指向子类的虚表,但是此时子类虚表中已将父类的虚函数覆盖了,所以调用的是子类的虚函数。这就实现了 父类指针指向子类对象仍旧可以调用子类虚函数!!!