也谈virtual

来源:互联网 发布:靠谱的日本代购淘宝店 编辑:程序博客网 时间:2024/06/01 10:05

先思考一个问题,来引出本文的主要内容

     class A是基类,class B是A的子类,那么请看下面的语句     A*  a = new B();   此时指针a的类型是B还是A?

        一直以来,我都认为铁定是B,我一直认为出现了类型转换,但直到今天才知道,这个想法是错误的。


       看代码

#include<iostream>using namespace std;class BaseA{public:void print(){cout<<"A"<<endl;}void test(){cout<<"aa"<<endl;}};class BaseB:public BaseA{private:void print(){cout<<"b"<<endl;}void test(){cout<<"bb"<<endl;}};

int main(int argc, char* argv[]){BaseA *p = new BaseB();cout<<typeid(*p).name()<<endl;p->print();p->test();return 1;}

运行出来的结果让我大吃一惊,指针的类型是BaseA,而不是我以为的BaseB.


为什么没有出现我想象中的类型转换呢?我只能做出这样的推测,之所以不转换,是因为不需要转换,因为不涉及任何的多态,转换反而是错误的。

修改一下代码,将BaseA的print方法改为 virtual

#include<iostream>using namespace std;class BaseA{public:virtual void print(){cout<<"A"<<endl;}void test(){cout<<"aa"<<endl;}};class BaseB:public BaseA{private:void print(){cout<<"b"<<endl;}void test(){cout<<"bb"<<endl;}};

再次执行main

原创粉丝点击