也谈virtual
2015-10-17 14:07
288 查看
先思考一个问题,来引出本文的主要内容
class A是基类,class B是A的子类,那么请看下面的语句 A* a = new B(); 此时指针a的类型是B还是A?
一直以来,我都认为铁定是B,我一直认为出现了类型转换,但直到今天才知道,这个想法是错误的。
看代码
运行出来的结果让我大吃一惊,指针的类型是BaseA,而不是我以为的BaseB.
为什么没有出现我想象中的类型转换呢?我只能做出这样的推测,之所以不转换,是因为不需要转换,因为不涉及任何的多态,转换反而是错误的。
修改一下代码,将BaseA的print方法改为 virtual
再次执行main
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
相关文章推荐
- leedcode: Course Schedule
- uint8_t 头文件为#include<stdint.h>
- 数组随机排序
- [Leetcode] Binary Tree Paths, Solution
- Merge Intervals
- 【图像处理】数字图像处理软件-特效--光晕特效(五)
- 黑马程序员--指向指针的指针 写的非常好 适合0基础菜鸟
- printf PRIu64
- 微信jsSDK开发
- 过渡性html
- Lucene之——输出分词结果的核心代码
- 初识java——Java程序的历史、开发和运行
- 微信红包引流量攻略
- java多线程学习笔记(七) ——消费者与生产者(LOCK、Condition接口)
- Python 内建函数--map()
- Ubuntu 安装配置Zookeeper
- C语言初学记录
- 自动定量发表删除空间说说脚本代码
- 【剑指offer】面试题35:第一个数字只出现一次
- Code Forces 586 B. Laurenty and Shop(水~)