根据基类指针判断指针指向的子类
来源:互联网 发布:360白名单防拦截域名 编辑:程序博客网 时间:2024/05/21 08:50
近期突然自己想到了一个问题:如果我现在有一个基类,它有很多个子类。同时现在又有一个基类指针,它指向一个子类,但是我不知道其具体是哪一个子类,所以如果我想知道它实际指向哪个子类在java中可以有instanceof可以实现,而在C++中怎么实现呢?
后来我想了一段时间,终于想明白了,在C++中如果想在运行而不是在编译的过程中获得对象的具体的类型,那么就必须要用到虚函数。其实虚函数的出现就可以理解为需要在运行的时候知道对象的具体类型,反之亦然。既然用到了虚函数,那么就可以实用dynamic_cast<>()函数来判断指针或者引用的具体类类型了,于是我下了下面的代码作为例子,其类的关系如图:
代码如下:
#include <iostream>using namespace std;class A{public: A(){} virtual ~A(){} };class B:public A{public: B(){} ~B(){} };class C:public A{public: C(){} ~C(){} };class D:public A{public: D(){} ~D(){}};int main(int argc, const char * argv[]) { A* pa = new D(); if((dynamic_cast< B* >( pa )) != nullptr){ cout<<"此类为B"<<endl; }else if((dynamic_cast<C*>(pa)) != nullptr){ cout<<"此类为C"<<endl; }else if((dynamic_cast<D*>(pa)) != nullptr){ cout<<"此类为D"<<endl; } delete pa; return 0;}注意到上面的代码中,我把基类的析构函数设为虚函数。
接着我又想,如果我不是使用虚函数,那么就不能使用dynamic_cast<>()函数来判断了,因为使用dynamic_cast<>()函数中的指针或者引用对应的类中至少要含有一个虚函数。经过我查阅网上的资料,发现如果你允许类有虚函数的话,可以通过在基类中添加虚函数类实现判断指针所指向的真正子类;如果类中不允许出现虚函数,那么你只能在每个类中实现类似于getType()的函数,让它返回能表示所有类类型的枚举类型(这里介绍一个stackoverflow上的回答点击打开链接)。当然,一般不会出现后者的情况,我还是建议再用前者的方法,最简单的方式就是将析构函数设置成虚函数。
0 0
- 根据基类指针判断指针指向的子类
- 关于c++指向子类的基类指针,与指向子类的子类指针
- c++ 动态判断基类指针指向的子类类型(typeid)
- c++ 动态判断基类指针指向的子类类型(typeid)
- c++ 动态判断基类指针指向的子类类型(typeid)
- 父类指针指向的子类实例
- C++的子类指针指向父类
- 基类指针指向子类对象数组的问题
- 指向父类的指针可以指向子类的对象
- 代码片段----指针的写法、父类指针指向子类
- C++ 父类指针指向子类对象||子类指针指向父类对象的理解
- C++ 父类指针指向子类对象||子类指针指向父类对象的理解
- C++关于父类指针指向子类对象的问题
- 关于C++的子类指针指向父类
- [转载]关于C++的子类指针指向父类.
- [转载]关于C++的子类指针指向父类
- 关于C++的子类指针指向父类
- 父类指针指向子类对象的理解
- 利用R语言的ggplot2包画分组boxplot
- SVN -提交冲突解决方案
- 笔记:学习 Java同步机制 -Synchronization
- Android java 中如何优雅的结束线程
- 类与对象
- 根据基类指针判断指针指向的子类
- DirectX11 地形水波纹理示例Demo
- 机器学习导论笔记——绪论
- static关键字
- 无名
- GOF23设计模式之 命令模式command
- final关键字
- 用CocoaPods做iOS程序的依赖管理
- OpenGL 缺省视景体是中心在原点,边长为2的立方体