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 大神的代码[这里以我的代码为例 ...
随机推荐
- BufferedReader readLine
import org.apache.commons.codec.binary.Base64;import org.apache.commons.codec.digest.DigestUtils; In ...
- Hadoop TaskScheduler源码分析
TaskScheduler是MapReduce中的任务调度器.在MapReduce中,JobTracker接收JobClient提交的Job,将它们按InputFormat的划分以及其他相关配置,生成 ...
- 【Windows】命令行查询占用端口信息
Windows上查询443端口被占用的信息: NETSTAT.EXE -nao | findstr "443" 查询结果 杀掉进程: tskill 2888
- OracleJDK与OpenJDK的区别和联系
OpenJDK原是SunMicrosystems公司为Java平台构建的Java开发环境(JDK)的开源版本,完全自由,开放源码.OracleJDK里面包含的JVM是HotSpotVM,HotSpot ...
- Spring整合Struts2 XML版
1.jar包 <!--spring配置--> <dependency> <groupId>org.springframework</groupId> & ...
- springBoot学习 错误记录
1.下面结果 会出现500错误 原因:thymeleaf相关包版本不兼容导致 解决:之前配置的3.0.9对应2.1.1&2.2.2,3.0.6对应2.2.2&2.1.1都不可以,下面的 ...
- Java基础反射-调用类
Student类 package com.test.wang; import java.lang.reflect.Constructor; import java.lang.reflect.Field ...
- strlen()与mb_strlen()的作用分别是什么
strlen和mb_strlen都是用于截取字符串的,其中strlen只针对单字节编码字符 如果是多字节编码字符 如gbk和utf8 使用strlen会出现乱码 此时可以使用mb_strlen(),专 ...
- vue实现选中列表功能
<template> <div> <ul v-for="prop in items"> <dt>{{prop.name}}</ ...
- Servlet和JavaBean
1.Servlet简介: Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间 ...