1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的;

2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的;

3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的。

将上面三句话总结成一句话就是:当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数;

              当父类子类有同名虚函数的时候呢,调用的是指针转换前指向的对象类型的函数。

详见以下代码:

#include <iostream>using namespace std;class Base
{
public:virtual void f(){cout<<"Base::f"<<endl;}virtual void g(){cout<<"Base::g"<<endl;}void h(){cout<<"Base::h"<<endl;}
};class Derived:public Base
{
public:virtual void f(){cout<<"Derived::f"<<endl;}virtual void g(){cout<<"Derived::g"<<endl;}void h(){cout<<"Derived::h"<<endl;}
};int main()
{Base* pB=new Base();cout<<"当基类指针指向基类对象时:"<<endl;pB->f();pB->g();pB->h();cout<<endl;Derived *pD=(Derived*)pB;cout<<"当父类指针被强制转换成子类指针时:"<<endl;pD->f();pD->g();pD->h();cout<<endl;Derived *pd=new Derived();cout<<"当子类指针指向子类时候"<<endl;pd->f();pd->g();pd->h();cout<<endl;Base *pb=(Base *)pd;cout<<"当子类指针被强制转换成父类指针时:"<<endl;pb->f();pb->g();pb->h();cout<<endl;Base *pp=new Derived();cout<<"父类指针指向子类对象时候:"<<endl;pp->f();pp->g();pp->h();cout<<endl;}

执行结果如下图:

转自:http://www.cnblogs.com/mu-tou-man/p/3925433.html

【转】父类子类指针相互转换问题相关推荐

  1. c++中父类子类对象指针相互转换,成员函数调用方式

    c++中父类子类对象指针相互转换的问题: 在面向对象开发时,某些场景下需要将子类对象的指针强转成父类指针进行调用,或者,将父类指针强转成子类指针进行调用,这个时候成员函数调用规律是什么样的? 规律:不 ...

  2. C++ 指向子类的指针转型为指向父类类型指针之后指向的对象地址不变

    C++ 指向子类的指针转型为指向父类类型指针之后指向的对象地址不变 例子: class A{int a;int b; };class B:public A{int c; };int main(){B* ...

  3. 父类指针指向子类对象,子类指针不能指向父类对象

    class Parent { public:int a };class Child :public Parent { public:int b; }Parent类占内存大小范围:int a; 占4个字 ...

  4. 父类(指针、引用)指向子类对象

    父类(指针.引用)指向子类对象 1. 父类类型指向子类对象 include <stdlib.h> #include <iostream> using namespace std ...

  5. C++的指针的坑:“new[]的指针需要delete[]”和“子类指针可以转父类指针”的两条规则成功的冲突到了一起...

    原文地址:http://www.cppblog.com/vczh/archive/2013/04/27/199765.html posted on 2013-04-27 17:24 陈梓瀚(vczh) ...

  6. 向上转型(子类指针赋值给父类指针)

    类其实也是一种数据类型,也可以发生数据类型转换,不过这种转换只有在基类(父类)和派生类(子类)之间才有意义,并且只能将派生类赋值给基类,包括将派生类对象赋值给基类对象.将派生类指针赋值给基类指针.将派 ...

  7. C++>继承,继承方式及其比较,子类和父类对象指针,派生类的默认成员函数,虚继承,继承与友元,继承与静态成员

    继承 继承的概念与定义 概念: 继承是指一个子类(或称为派生类)继承父类(或称为基类)的特征(属性和操作).继承是面向对象程序设计时实现代码复用的重要手段,它允许在原有的类的基础上进行扩展,增加功能, ...

  8. 第九天2017/04/18(3、重载/覆盖 PK 重写/重定义、父类子类混搭风、抽象类)

    1.重载/覆盖 PK 重写/重定义 [预备知识] 函数重载必须在同一个类中发生子类无法重载父类的函数,父类同名的函数将会被名称覆盖重载是在编译期间根据参数类型和个数决定函数调用重载只放在同一个类之中, ...

  9. JAVA学习笔记--类型转换(父类子类 Object 基本类型 String) 拆装箱 包装类

    最近一段时间忙着学习JAVA,本来net学的也不怎么好,趁着这个机会转下方向学习JAVA.不过.NET core的开源还是有点搞头的,微软了解一下.接下来几天我也会陆续写一些内容关于线程和集合等方面, ...

最新文章

  1. 【kuangbin带你飞】专题六 最小生成树
  2. 如何编译和运行C++程序
  3. Mahout分步式程序开发 基于物品的协同过滤ItemCF
  4. python replace_DF.replace介绍
  5. 无招胜有招之Java进阶JVM(九)HotSpot
  6. vs cpp生成h文件_lib 和 dll 的区别、生成以及使用详解
  7. javax.mail.MessagingException: 553 authentication is required
  8. unix和linux命令_Linux / Unix系统中SSH命令的用法
  9. 东北大学linux程序设计考试,Linux认证考试试题及答案
  10. Qt入门(六)——抽奖系统的实现
  11. 鹤林全集·闲情志友 | 第一篇——阿鑫
  12. python中result的用法_python中result的用法
  13. 微信小程序checkbox的全选以及所有checkbox选中之后的全选
  14. Java技术笔记1:类与对象实例之系统常用类
  15. 【C语言】练习函数调用
  16. 建立高效的测试团队 (转自关河)
  17. 敏友的【敏捷个人】有感(9): 2012年,开始我的敏捷个人之行
  18. 《构建之法》第十六章 IT行业的创新
  19. 关于js中window.location.href,location.href,parent.location.href,top.location.href的用法
  20. Ktolin-Android studio调用蓝牙模块stepbystep

热门文章

  1. main函数第3个参数envp装的是什么(envp:环境变量)
  2. quartus中pin planner中分配引脚的对话框不见了,怎么找回(附方法)
  3. 汽车常识全面介绍 - 车身
  4. API设计中防重放攻击
  5. Linux下命令行的彩色终端
  6. 使用Microsoft Azure Backup备份Hyper-V数据
  7. Android开发:Kotlin下配置DataBinding
  8. DBA巡检常用的SQL语句
  9. 阅读鸟哥的风雪之隅PHP博客的笔记(1)
  10. 噩耗...............