基类指针指向派生类对象

在这里插入图片描述
A作为基类,B作为派生类
基类指针指向派生类对象,只能调用基类原有的,而不能调用派生类中的
从pa=&b,这里可看出,解释一下:这里取得是b的首地址,而pa的长度是由数据类型的内存所占大小决定的
pb=&a 的话是会报错的,因为pb的长度已经超出了A的内存范围,多出的那一部分可能会乱指,导致安全性缺失
当然pb->showA()也是会报错的,同样的道理。
所以,派生类指针不能指向基类对象

构造函数能定义为虚函数?
不能,虚函数是需要通过对应的vtable虚指针来调用,而虚指针是在对象创建完毕才有的,但是构造函数是要在对象创建时调用,这之间无法同时达到要求,所以构造函数不能定义为虚函数。

用基类的指针去指向对象,在析构时就会出现问题,因为派生类对象在析构时是先释放派生类,再释放基类(正确的做法),而用基类指针指向派生类对象,析构时是只析构基类(错误的做法),从而导致派生类的那一部分没有被释放掉,成为僵尸内存或称内存泄漏
所以用基类指针指向派生类对象,要用virtual析构函数,使基类指针可以指向派生类中(virtual的作用:根据对象的实际类型,调用相应的类型函数。),使得再手动释放内存delete 时,可以调用派生类的析构函数,从而自动调用基类的析构函数。