也谈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
- 也谈virtual
- 也谈virtual
- 我也说说virtual 和非 virtual
- 也谈.net下面的new、virtual和override(一)
- 也谈.net下面的new、virtual和override(二)
- virtual
- virtual
- Virtual
- virtual
- VIRTUAL
- Virtual
- virtual
- virtual
- virtual
- virtual
- virtual
- virtual
- virtual
- VB6 从数据库中导出数据到Excel(项目中用到的)
- android程序的真正入口点之application
- JacobiAndGauss-Seidel迭代(基于java)
- 如何使用arm-linux-androideabi-addr2line
- 百度作站群的小秘密
- 也谈virtual
- 常用的运行命令
- 为什么要将thread对象post到handler中执行呢?
- mongodb 查询要点说明
- js判断年龄是否为数字
- 获取JVM运行状况的几种方式
- 出色的职业经理人共有的一些特征
- 软件工程师的出路在哪里?
- 结构化稀疏----Learning with Structured Sparsity(学习与结构化稀疏)