C++ 学习笔记 (七)继承与多态 virtual关键字的使用场景
在上一篇 C++ 学习笔记 (六) 继承- 子类与父类有同名函数,变量 中说了当父类子类有同名函数时在外部调用时如果不加父类名则会默认调用子类的函数。C++有函数重写的功能需要添加virtual关键字,当时写上篇博文的时候在想那么既然默认使用子类的同名函数那么这个virtual有什么意义呢?
这篇博文主要讲述 多态:一句相同的语句能有不同的实现。
当父类和子类有同名函数,调用时牵扯到了指针那么就跟virtual有关系了。
看以下几种情况:
定义两个类:父类子类有同名函数print();
class Parent
{
public: void print() //子类的和父类的函数名字一样
{
cout<<"Parent 打印 "<<endl;
} }; class Child : public Parent
{
public: void print()
{
cout<<"Child 打印 "<<endl;
} };
1.当父类和子类都有同名函数prin()t时,使用Parent 类指针,指向子类对象或者父类对象调用的函数都是父类的函数。
Parent *base = NULL;
base = &p1; //父类对象
base->print(); //执行父类的打印函数 base = &c1; //子类对象
base->print(); //也是执行父类函数
2.使用引用,当引用是父类时调用的函数也是父类的同名函数
Parent &base2 = p1;
base2.print();//调用父类函数 Parent &base3 = c1; //base3是c1 的别名
base3.print(); //调用父类函数
3.函数传参为父类 类型时,无论传入子类还是父类都只执行父类的函数
void howToPrint(Parent *base) //传参为父类的指针
{
base->print();
} void howToPrint2(Parent &base) //传参为父类的引用
{
base.print();
} //函数调用 均执行父类的函数
howToPrint(&p1);
howToPrint(&c1); howToPrint2(p1)
howToPrint2(c1);
总结:
其实上面三个情景下当我们一个指针指向了子类,或者引用子类那么我们希望调用函数的时候是调用子类的函数,但是实际情况却不是这样。这时候就需要virtual关键字了。
lass Parent
{
public: virtual void print() //子类的和父类的函数名字一样
{
cout<<"Paren打印 "<<endl;
} }; class Child : public Parent
{
public: virtual void print() //virtual 父类写了virtual,子类可写 可不写
{
cout<<"Child 打印 "<<endl;
} };
使用了virtual关键字定义的函数,那么在上述三种情况下只要指针是指向子类,或是引用子类那么往后的调用就按照我们的预想调用子类里的函数。再回顾一下这句话:
多态:一句相同的语句能有不同的实现。
举例:
void howToPrint(Parent *base) //传参为父类的指针
{
base->print();
}
传入的指针决定了最后执行的函数,出入父类指针则执行父类的print函数,出入父类的派生类则调用这个派生类的print函数,这样一句相同的语句就有了不同的实现。
void howToPrint(Parent *base) //传参为父类的指针
C++ 学习笔记 (七)继承与多态 virtual关键字的使用场景的更多相关文章
- 0022 Java学习笔记-面向对象-继承、多态、组合
继承的特点 单继承:每个子类最多只有一个直接父类,注意是直接父类,间接父类个数不限 注意父类的概念:A-->B-->C-->D,在这里,ABC都是D的父类,C是D的直接父类,AB是D ...
- Java编程思想学习笔记_2(继承和多态)
静态初始化: 静态初始化只在必要的时刻进行.(即当程序需要加载类进入内存的时候,执行静态初始化.静态变量和静态代码块的初始化顺序,按照在代码中声明的顺序老执行.例如:如果要执行某个public类,那么 ...
- c++学习笔记之继承篇
title: c++学习笔记之继承篇 date: 2017-03-26 16:36:33 tags: [c++,继承,public,virtual,private,protected] categor ...
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- python3.4学习笔记(七) 学习网站博客推荐
python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
- iOS 学习笔记七 【博爱手把手教你使用2016年gitHub Mac客户端】
iOS 学习笔记七 [博爱手把手教你使用gitHub客户端] 第一步:首先下载git客户端 链接:https://desktop.github.com 第二步:fork 大神的代码[这里以我的代码为例 ...
随机推荐
- 关于Sumlime和其插件的安装
因为近期就要去实习了,第一次实习,估计又要重新在公司的电脑里面安装Sublime和其插件了,于是现将本地的插件截图看看,顺便写一个教程吧哈哈. 我好像又省了一件事情哈哈,昨天因为懒没有尝试重新弄一次s ...
- POJ1442 Black Box 堆
用大根堆和小根堆分别存放前$i-1$大的元素前$k-i$小的元素. 将当前序列的元素压入最小堆,如果最小堆的最小数大于最大堆的最大数则进行交换,保证最大堆中的所有数小于最小堆. 因为$i$值每进行一次 ...
- Spark (Python版) 零基础学习笔记(二)—— Spark Transformations总结及举例
1. map(func) 将func函数作用到数据集的每个元素,生成一个新的分布式的数据集并返回 >>> a = sc.parallelize(('a', 'b', 'c')) &g ...
- DNS A记录 CNAME NS记录等的区别
DNS域名解析 tracetrt dig A记录 将此域名绑定到固定ip C记录 将此域名绑定到另一个域名上,通常是A记录的别名 AAAA记录 用来绑定ipv6地址 https://www.ezloo ...
- php配置redis
redis扩展程序下载链接(版本3.0.504) 链接: https://pan.baidu.com/s/1QfrjtnifOl8SPf7XCEly2g 密码: u6x6 wampserver下载地址 ...
- Docker | 第零章:前言
说在前面 对于一个后端开发者而言,对于Docker也是前年十月份才开始听说的(很惭愧,Docker在2013年就已经出现了).当时有个新项目启动,领导们在技术选型时,在部署方面选定的是Docker.那 ...
- SpringBoot | 第十二章:RabbitMQ的集成和使用
前言 上节讲了缓存数据库redis的使用,在实际工作中,一般上在系统或者应用间通信或者进行异步通知(登录后发送短信或者邮件等)时,都会使用消息队列进行解决此业务场景的解耦问题.这章节讲解下消息队列Ra ...
- jQuery读取和设定KindEditor值的方法
转载自:https://www.jb51.net/article/43595.htm 侵删 jQuery读取和设定KindEditor值的方法 更新时间:2013年11月22日 09:03:56 ...
- 面向对象(OOP)一
一.面向对象理论 1)面向对象概念 面向对象编程(object Oriented Programming,OOP),是一种计算机编程构架,OOP达到软件工程的三个目标重用.灵活和扩展性. 2)什么是对 ...
- uvm_port_base——TLM1事务级建模方法(五)
文件: src/tlm1/uvm_port_base.svh 类: uvm_port_base uvm_port_component_base派生自uvm_component,因此具有其所有特性.提供 ...