前文:C++之继承探究(五):子类对象作父类对象使用

虚函数的使用

  当父类指针或引用指向子类对象,而子类中又覆盖了父类的函数,希望用父类指针或父类引用,调用到正确版本的函数(父类指针或引用实际所指向的对象版本的函数),需要把该成员函数声明为虚函数。

  虚函数可实现多态。

例1:

附例1代码:

//小问学编程
#include<iostream>
using namespace std;
class Base
{public:virtual void func()//加了virtual{cout<<"Base function!"<<endl;}
};class Derived : public Base
{public:void func() {cout<<"Derived function!"<<endl;}
};void foo(Base & b)
{b.func();
}int main(int argc, const char * argv[])
{Base b;Derived d;Base* p = &d;//父类指针指向子类对象Base& br = d;//父类引用指向子类对象b.func();d.func();p->func();br.func();foo(b);foo(d);return 0;
}

例2:

附例2代码:

//小问学编程
#include<iostream>
using namespace std;
class Base
{public:virtual void func()//加了virtual{cout<<"Base function!"<<endl;}
};class Derived1 : public Base
{public:void func() {cout<<"Derived1 function!"<<endl;}
};class Derived2 : public Base
{public:void func() {cout<<"Derived2 function!"<<endl;}
};int main(int argc, const char * argv[])
{Base b;Derived1 d1;Derived2 d2;Base* p;p=&b;p->func();p=&d1;p->func();p=&d2;p->func();return 0;
}

例3:将例2改为指针数组形式来调用指定版本的虚函数

附例3代码:

//小问学编程
#include<iostream>
using namespace std;
class Base
{public:virtual void func()//加了virtual{cout<<"Base function!"<<endl;}
};class Derived1 : public Base
{public:void func() {cout<<"Derived1 function!"<<endl;}
};class Derived2 : public Base
{public:void func() {cout<<"Derived2 function!"<<endl;}
};int main(int argc, const char * argv[])
{Base b;Derived1 d1;Derived2 d2;Base* p[3]={&b,&d1,&d2};//父类的指针数组for(int i=0;i<3;i++)p[i]->func();return 0;
}

结论:
  (1) 有了虚函数后,无需向下转型,就可以正确的用父类的指针或引用,调用到子类的函数。
  (2) 虚函数目的:期望父类指针(或引用),不管指向父类还是子类,在调用override函数时,可以反映对象的真实情况。
  (3) 调用虚函数时,到底调用哪个版本,是根据指针或引用实际所指向的对象的类型来确定,而不是调用者本身的类型来确定。

例4:虚函数中构造和析构的顺序说明

附例4代码:

//小问学编程
#include<iostream>
using namespace std;
class Thing
{public:virtual void what_Am_I(){cout << "I am a Thing.\n";}~Thing(){cout<<"Thing destructor"<<endl;}
};class Animal : public Thing
{public:
//如果父类的成员函数是虚函数,则子类
//覆盖后,不写virtual,也是虚函数void what_Am_I( ){cout << "I am an Animal.\n";}~Animal(){cout<<"Animal destructor"<<endl;}
};int main()
{Thing t ;Animal x ;Thing* array[2];//声明一个父类指针数组array[0] = &t;  //指向父类array[1] = &x;  //指向子类for (int i=0; i<2; i++){array[i]->what_Am_I();}return 0;
}

C++之继承探究(六):虚函数和多态相关推荐

  1. C++ 面向对象(二)多态 : 虚函数、多态原理、抽象类、虚函数表、继承与虚函数表

    目录 多态 多态的概念 多态的构成条件 虚函数 虚函数的重写 协变(返回值不同) 析构函数的重写(函数名不同) final和override final override 重载, 重写, 重定义对比 ...

  2. C++编程思想:继承与虚函数以及多态

    文章目录 简介 实现虚函数多态的技术原理 对象切边 析构函数和构造函数中的虚函数 使用继承的类的析构函数应该使用虚函数修饰符 简介 继承与虚函数与多态是浑然一体的三个概念,父类中虚函数可以表现出多态特 ...

  3. 初入c++(六)虚函数实现多态,虚析构函数,虚函数表和多态实现机制,纯虚函数。

    1.c++多态的概念以及用途. 1.1虚函数实现多态 通过基类指针只能够访问派生类的成员变量,不能够访问派生类的成员函数. 解决问题的办法:使用虚函数(virtual function),只需要在函数 ...

  4. C++中虚函数与多态实现

    多态,什么是多态?在计算机语言中,多态就是指一个接口或者方法,有多种展现形态.在C++中,通过父类指针调用子类方法,可以让父类指针有多种形态. C++中实现多态的方式有:虚函数,重载,模板,绑定等.此 ...

  5. C语言面向对象编程(三):虚函数与多态

    在< C++ 编程思想>一书中对虚函数的实现机制有详细的描述,一般的编译器通过虚函数表,在编译时插入一段隐藏的代码,保存类型信息和虚函数地址,而在调用时,这段隐藏的代码可以找到和实际对象一 ...

  6. 子类重写父类虚函数_C/C++编程笔记:关于C++的虚函数和多态,你真的了解吗?...

    前言 本章节主要针对于C++中的虚函数和多态做一个详细介绍. 虚函数 虚函数的长相其实很简单,在C++类型用virtual修饰的函数就是虚函数,如下代码: 虚函数对于本类的影响:存在虚函数类的内存会多 ...

  7. c++-虚函数与多态

    转发:http://blog.csdn.net/neiloid/article/details/6934135 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向 ...

  8. C++之关于虚函数和多态的分析和补充

    前文:<Essential C++>笔记之漫游:面向对象编程思维 同时推荐一篇总结得非常清晰的博文:C++ 子类继承父类纯虚函数.虚函数和普通函数的区别   不说废话,直接上程序: 例一( ...

  9. (转) 用虚函数实现多态

    http://www.cnblogs.com/nihaoCPP/p/4422682.html 用虚函数实现多态 在理解了面向对象的继承机制之后,我们知道了在大多数情况下派生类是基类的"一种& ...

  10. 虚函数:多态的实现原理

    一.序言  C++ 中的虚函数的作用主要是实现了多态的机制.关于多态,说白了就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数(当然引用也可以达到该目的,引用也是指针的另一 ...

最新文章

  1. 2020-09-05
  2. 【Spring】【JUnit】单元测试
  3. linux安装后硬盘变小,Linux硬盘安装步骤
  4. 拦截推送信息_Android10.0公测版H2OS For OnePlus 6T第1版已推送更新
  5. 8-12-COMPETITION
  6. matlab 读取nc
  7. python随机生成验证码_Python生成随机验证码
  8. 【解题报告】SRM-08
  9. vue____后台管理系统搭建(推荐,懒得自己写了)
  10. IPsec的NAT穿越详解
  11. java手机号正则校验工具类
  12. opencv19:轮廓凸包,距离与匹配
  13. Python核心编程的四大神兽:迭代器、生成器、闭包以及装饰器
  14. 【软件】Excel文件双击打开巨慢,先开excel程序,将表格拖进来就很快,夜神模拟器导致开excel很慢
  15. 15个富有创意的单页设计
  16. bixby怎么编程_三星的Bixby可以做什么?
  17. selenium 模拟登陆豆瓣,爬取武林外传的短评
  18. PMP备考大全:经典题库(敏捷管理第9期)
  19. 七彩虹将星x15xs 2022款 怎么样
  20. 骁龙780G​和骁龙750G哪个好 高通骁龙780G​和骁龙750G区别参数对比

热门文章

  1. Java停车场管理系统使用栈和队列任务台程序
  2. 基于JAVA+SpringMVC+Mybatis+MYSQL的宿舍管理平台系统
  3. QML如何与C++交互
  4. 软件概要设计文档(终)
  5. 允许远程用户登录访问mysql的方法
  6. 关于vue如何解决数据渲染完成之前,dom树显示问题
  7. 关于sql多条件查询,但又不确定值的个数的方法。
  8. 开源势不可挡 IBM Power Systems Linux中心成立
  9. JS作用域链(转载)
  10. Flex Gumbo中如何自定义HSlider数据Tip样式的例子