c++中父类子类对象指针相互转换的问题:

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

规律:不论是上面说的哪种强制转换情况,强转后的指针在调用虚函数时失效,其他情况正常调用。

理解:1.子类指针强转成父类指针,使用这个父类指针调用成员函数,本来是应该调用父类自己的成员函数的,但由于子类的同名成员函数为虚函数,强转失效了,调用的还是子类的成员函数。

2.父类指针强转成子类指针,使用这个子类指针调用成员函数,本来是应该调用子类自己的成员函数的,但由于父类的同名成员函数为虚函数,强转失效了,调用的还是父类的成员函数。

示例代码:

#include <iostream>
using namespace std;
class Father
{
public:virtual void a() { cout << "Father::a" << endl; }virtual void b() { cout << "Father::b" << endl; }void c() { cout << "Father::c" << endl; }};
class Son:public Father
{
public:virtual void a(){cout<<"Son::a"<<endl;}void b(){cout<<"Son::b"<<endl;}void c(){cout<<"Son::c"<<endl;}
};int main()
{   Father *pF = NULL;Son    *pS = NULL;cout<<"当基类指针指向基类对象时:"<<endl; //最普通的情况,父类自己调用自己的成员函数pF=new Father();pF->a();pF->b();pF->c();cout<<"当父类指针被强制转换成子类指针时:"<<endl;pS=(Son *)pF;pS->a();pS->b();pS->c();cout<<"当子类指针指向子类时候: "<<endl;//最普通的情况,子类自己调用自己的成员函数pS=new Son();pS->a();pS->b();pS->c();cout<<"当子类指针被强制转换成父类指针时:"<<endl;pF=(Father *)pS;pF->a();pF->b();pF->c();cout<<"父类指针指向子类对象时候:"<<endl;pF=new Son();pF->a();pF->b();pF->c();return 0;
}

运行结果:

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

  1. VS中查看子类对象内存分布的方法

    文章目录 1 VS中查看子类对象内存分布的方法 1 VS中查看子类对象内存分布的方法 设置vs编译器: 在命令行中添加选项(打印指定类的内存分布):/d1 reportSingleClassLayou ...

  2. 关于类成员函数中访问同类对象的私有成员

    关于类成员函数中访问同类对象的私有成员,主要包含以下几种场景: a. 在C++的类的成员函数中,允许直接访问该类的对象的私有成员变量. b. 在类的成员函数中可以访问同类型实例的私有变量. c. 拷贝 ...

  3. C++中对string对象的初始化及赋值方式总结

    C++中对string对象的初始化及赋值方式总结 C++中的string对象是最常用的几种数据类型之一. 初始化string对象的方式有以下几种: string s1; //默认初始化,s1是一个空串 ...

  4. 2020-12-16子类对象指针强转成父类对象指针,父类对象指针调用子类函数问题(待整理)

    当父类中声明某个函数为虚函数,并且子类重载了这个虚函数以后,用父类对象的指针可以调用子类的相应函数,但前提是该指针指向的对象是子类的对象,否则没有意义. 1.新建一个子类对象时,它首先执行它父类的构造 ...

  5. 【转】继承过程中 父类子类的 字段方法 内存分配 (非java语言)

    名人名言:思想好比火星:一颗火星会点燃另一颗火星.一个深思熟虑的教师和班主任,总是力求在集体中创造一种共同热爱科学和渴求知识的气氛,使智力兴趣成为一些线索,以其真挚的.复杂的关系--即思想的相互关系把 ...

  6. java子类代码块_java中父类子类静态代码块、构造代码块执行顺序

    父类静态(代码块,变量赋值二者按顺序执行) 子类静态 父类构造代码块 父类构造方法 子类构造代码块 子类构造方法 普通方法在实列调用的时候执行,肯定位于上面之后了 //父类A public class ...

  7. js for in遍历对象_JS中轻松遍历对象属性的几种方式

    自身可枚举属性 Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 .如果对象的键-值都 ...

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

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

  9. C++对象数组与对象指针的用法【C++初学面向对象编程】

    文章目录 一.对象数组 二.对象指针 一.对象数组 1.概念 对象数组本质上就是:数组中每一个元素都是同一个类的对象. //定义对象数组(装有3个对象的数组) Box aa[3]={Box(1, 1, ...

最新文章

  1. CentOS基础命令大全
  2. 亿级商品详情页架构演进技术解密 | 高可用架构系列 二
  3. 详解一个ThreadLocal 的谜题
  4. ORM多表查询——关联查询
  5. pycharm git 超详细教程
  6. 简析Kubernetes八大重要特性
  7. Python 入门网络爬虫之精华版
  8. java list for循环遍历_详解Java中list,set,map的遍历与增强for循环
  9. android编程多组件布局,Android把多个控件定义成一个整体的布局类使用
  10. 命名问题导致的一个bug
  11. TOGAF9-certification简介
  12. Unix/Linux编程:操作系统中的TCP/IP软件结构
  13. 请大家帮忙看下这个shader的问题:
  14. Jenkins Git Changelog Plugin
  15. E492: Not an editor command: WQ
  16. 华为P30、P30pro亲手体验,最新壁纸大曝光!
  17. 处理python安装问题的集锦
  18. 计算机科学期刊几个外审,期刊投稿服务发表论文外审一般几个专家审稿_优发表...
  19. 【webrtc】SDP序列化与反序列化
  20. java h5 桌面应用_用HTML5打造本地桌面应用

热门文章

  1. zyplayer-doc 1.0.1 发布,你家所需的文档管理工具他都承包了!
  2. 服务器遭受***后的处理过程
  3. linux下i2c驱动笔记
  4. SaaS产品服务进行网络推广的必要性
  5. KingTable 是表格动态列插件
  6. Mapv 是地理信息可视化开源库
  7. 前端开发 AMD 和 CMD 的规范区别
  8. Speaker Recognition: Feature Extraction
  9. 无线视频服务器家里好用吗,短视频APP为什么选择国内大带宽服务器?国内服务器有什么优势...
  10. 【参数辨识】永磁同步电机的参数辨识