读书人

C++继承多态小疑点

发布时间: 2012-09-12 09:21:30 作者: rapoo

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(),这叫函数的覆盖不叫函数的重写,建议楼主百度一下。
[解决办法]
探讨

说错了pB是指向继承类的为什么不输出Derived display1

[解决办法]
首先public是公有继承,基类和子类之间是“是”的关系,那个子类就是基类的一种形式,所以可以子类到基类转化。
《effective c++》 有完美解析

读书人网 >C++

热点推荐