C++继承多态小问题
- C/C++ code
#include <iostream>#include <string>using namespace std;class Base{public: Base(){cout<<"Base"<<endl;} void display1(){cout<<"Base display1"<<endl;} virtual void display2(){cout<<"Base display2"<<endl;}};class Derived : public Base{public: Derived(){cout<<"Derived"<<endl;} void display1(){cout<<"Derived display1"<<endl;} void display2(){cout<<"Derived display2"<<endl;}};void main(){ Base *pB=new Derived; pB->display1(); pB->display2(); delete pB; pB=NULL; cout<<"------------------------------"<<endl; Derived *pD=new Derived; pD->display1(); pD->display2(); delete pD; pD=NULL; cout<<"------------------------------"<<endl; Base *pb=new Base; pb->display1(); pb->display2(); delete pb; pb=NULL;}Base *pB=new Derived;//pB的类型是基类吧?然而指向的内容却是子类的? 这个为什么合法想不通
基类类型可以转换成子类类型吧? 子类不能转成基类型吗
[解决办法]
那是一个指针,只要你愿意,你可以让它成为任何类型
编译器也是根据指针类型来做一些事情
[解决办法]
这个叫安全的向上转换,这是基础知识了。
[解决办法]
都可以。只是子类转基类会被砍点子类的东西。
[解决办法]
在析构函数之前加上virtual就行了,这样就能够保证对象的正确的析构顺序
http://blog.csdn.net/dazhong159/article/details/7797880
[解决办法]
第一个问题:Base *pB=new Derived;//pB的类型是基类吧?然而指向的内容却是子类的?
可以这样理解:比如说基类代表动物,子类代表人,那么当然可以把人说成是动物(这叫向上转型,是安全的),如果说动物就是人(这叫向下转型,是不安全的),这就有点片面了。
第二个问题:
那Base *pB=new Derived;
pB->display1();
pB->display2();
delete pB;
pB=NULL;
既然pB是指向子类的,为什么pB->display1()输出的是Base display1 而不是Derived display1;
pB->display1(),这叫函数的覆盖不叫函数的重写,建议楼主百度一下。
[解决办法]
[解决办法]
首先public是公有继承,基类和子类之间是“是”的关系,那个子类就是基类的一种形式,所以可以子类到基类转化。
《effective c++》 有完美解析