函数重载、函数隐藏、函数覆盖
函数重载只会发生在同作用域中(或同一个类中),函数名称相同,但参数类型或参数个数不同。 函数重载不能通过函数的返回类型来区分,因为在函数返回之前我们并不知道函数的返回类型。

函数隐藏和函数覆盖只会发生在基类和派生类之间。

函数隐藏是指派生类中函数与基类中的函数同名,但是这个函数在基类中并没有被定义为虚函数,这种情况就是函数的隐藏。
所谓隐藏是指使用常规的调用方法,派生类对象访问这个函数时,会优先访问派生类中的这个函数,基类中的这个函数对派生类对象来说是隐藏起来的。 但是隐藏并不意味这不存在或完全不可访问。通过 b->Base::func()访问基类中被隐藏的函数。

函数覆盖特指由基类中定义的虚函数引发的一种多态现象。在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。

函数覆盖的条件:

1: 基类中的成员函数被virtual关键字声明为虚函数;
2:派生类中该函数必须和基类中函数的名称、参数类型和个数等完全一致;
3:将派生类的对象赋给基类指针或者引用,实现多态。
函数覆盖(多态)实现了一种基类访问(不同)派生类的方法。我们把它称为基类的逆袭。

基类指针和派生类指针之间的转换
1. 基类指针指向基类对象、派生类指针指向派生类对象
这种情况是常用的,只需要通过对应类的指针直接调用对应类的功能就可以了。

#include<iostream>
using namespace std;class Father{
public:    void print(){printf("Father's function!");}
};class Son:public Father
{
public:void print(){printf("Son's function!");}
};int main()
{Father f1;Son s1;Father* f = &f1;Son* s = &s1;f->print();cout<<endl<<endl;s->print();
}

2. 基类指针指向派生类对象

这种情况是允许的,通过定义一个基类指针和一个派生类对象,把基类指针指向派生类对象,但是需要注意,通常情况这时的指针调用的是基类的成员函数。分四种情况:

一、 函数在基类和派生类中都存在

这时通过“指向派生类对象的基类指针”调用成员函数,调用的是基类的成员函数。

  Father f1;Son s1;Father* f = &s1;f->print();  //调用的是基类成员函数

    二、函数在基类中不存在,在派生类中存在

由于调用的还是基类中的成员函数,试图通过基类指针调用派生类才有的成员函数,则编译器会报错。

error C2039: “xxx”: 不是“Father”的成员

    三、 将基类指针强制转换为派生类指针

这种是向下的强制类型转换,转换之后“指向派生类的基类指针”就可以访问派生类的成员函数:

 Son s1;Father* f = &s1;Son *s = (Son*)f;s->print1(); //调用派生类成员函数

但是这种强制转换操作是一种潜在的危险操作。

      四、基类中存在虚函数的情况

如果基类中的成员函数被定义为虚函数,并且在派生类中也实现了该函数,则通过“指向派生类的基类指针” 访问虚函数,访问的是派生类中的实现。允许“基类指针指向派生类”这个操作,最大的意义也就在此,通过虚函数和函数覆盖,实现了“多态”(指向不同的派生类,实现不同功能)。

Father f1;Son s1;Father* f = &s1;f->print();   //调用派生类成员函数

3. 派生类指针指向基类对象

会产生编译错误。基类对象无法被当作派生类对象,派生类中可能具有只有派生类才有的成员或成员函数。
即便是使用强制转换,将派生类指针强制转换成基类指针,通过这个“强制指向基类的派生类指针”访问的函数依然是派生类的成员函数。

Father f1;Son s1;Son* s=&s1;Father* f = (Father*) s;f->print();  //调用派生类成员函数

综上,可以通过基类指针访问派生类方法(强制转换和虚函数),不存在通过派生类指针调用基类成员函数的方法(即便是强制转换)。

感谢原作者的分享!
原文地址:https://blog.csdn.net/dcrmg/article/details/83472660

C++ 基类指针和派生类指针之间的转换相关推荐

  1. 基类数组存放派生类_永远不要将派生类数组赋值给基类类型指针

    C.152: Never assign a pointer to an array of derived class objects to a pointer to its base C.152:永远 ...

  2. C++基类指针指向派生类(指针)

    我们常用基类指针指向派生类对象来实现多态性. 私有继承不允许基类指针指向派生类 基类指针只能访问到基类中含有的公有成员. 当用基类指针指向派生类对象在动态分配堆上内存的时候,析构函数必须是虚函数! 成 ...

  3. C++的基类指针指向派生类对象,vector实现多态性

    添加问题: 练手创建一个表示各种不同包裹的继承层次. 在写代码时:要求vector来实现多态性 , 用基类指针变量指向子类对象. 前面的父类和子类定义: //创建一个表示各种不同包裹的继承层次 #in ...

  4. C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765

    https://www.zhihu.com/question/30838092/answer/49623765 C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? 代码如下 ...

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

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

  6. 不同派生方式下基类成员在派生类中的可访问范围属性

    不同派生方式下基类成员在派生类中的可访问范围属性 派生方式 派生方式 派生方式 基类成员 公有派生 私有派生 保护派生 私有成员 不可访问 不可访问 不可访问 保护成员 保护 私有 保护 公有成员 公 ...

  7. 虚函数之定义一个基类Shape,在此基础上派生出Rectangle和Circle再使用Rectangle类创建一个派生类Square。

    定义一个基类Shape,在此基础上派生出Rectangle和Circle,二者都有getArea( )函数计算对象的面积,再使用Rectangle类创建一个派生类Square.将getArea()改造 ...

  8. C++实例:基类BaseClass,派生类DerivedClass

    1.问题描述 定义一个基类BaseClass,从它派生出类DerivedClass,BaseClass有成员函数fn1().fn2(),DerivedClass也有成员函数fn1().fn2(),在主 ...

  9. 基类对象与派生类对象的关系

    点击打开原文链接 基类对象与派生类对象的使用关系 1. 派生类对象作为基类对象处理 由于派生类具有所有基类的成员,所以把派生类的对象赋给基类对象是合理的,不过要求这种继承方式必须是public方式.但 ...

  10. C++改变基类成员在派生类中的访问属性

    使用using声明可以改变基类成员在派生类中的访问属性.我们知道基类的公有成员经过公有继承,在派生类中其属性为public的,但是通过using 声明,我们可以将其改为private或protecte ...

最新文章

  1. 关于request取中文字符串变?的解决办法
  2. python 递归函数_Python尚学堂高淇|P82P86面向对象和面向过程的区别LEGB规则nonlocal_global递归函数阶乘计算案例...
  3. 个体重构:将重构应用到生活中
  4. Java-ArrayList和Vector的区别
  5. Android Training精要(六)如何防止Bitmap对象出现OOM
  6. java if emun_关于java:Enum与If-else
  7. 28 CO配置-控制-产品成本控制-成本对象控制-期末结算-定义行标识
  8. 华为交换机VLAN的配置和实施
  9. git的简单使用(windows)
  10. 人工智能万亿市场待挖掘
  11. DFT compiler极简示例2(使用autofix)
  12. linux操作系统中ssh的默认端口号,sshd服务的默认端口号
  13. 如何争取APP Store推荐位
  14. tf-faster-rcnn代码学习.目标检测(Tensorflow版Faster R-CNN)
  15. _snprintf_s
  16. 学习了C语言的第一个语言
  17. 王者荣耀最低战力查询接口
  18. 零基础如何学素描——什么是结构素描…
  19. window下命令查看cup和内存型号信息
  20. FPGA 处理视频SDRAM带宽计算

热门文章

  1. python info什么意思_python中log info 是什么文件
  2. 查找单词个数案列实现(字符串流)
  3. c语言识别按了esc键_憋了三年,史上最全的 F1~F12 键用法整理出来了
  4. matlab高斯求积法_实验3:利用SVM实现线性高斯分类
  5. 玩html5游戏用什么浏览器,玩HTML5游戏测浏览器傲游3最新版给力
  6. java 没有junit包,~项目导入时报错:程序包org.junit不存在
  7. Angr安装与使用之使用篇(十)
  8. mach-O文件结构分析
  9. java到js的中文无法显示,中文显示位(?)
  10. export和import 输出/接收模块变量的接口