c++学习笔记_6
前言:本笔记所对应的课程为中国大学mooc中北京大学的程序设计与算法(三)C++面向对象程序设计,主要供自己复习使用,且本笔记建立在会使用c和java的基础上,只针对与c和java的不同来写
多态
虚函数和多态的基本概念
虚函数形式:类中成员函数前加
virtual
关键字的成员函数就是虚函数。virtual
关键字只用在函数声明前,在具体写函数体时不需要写virtual
关键字(就像friend
一样)构造函数和静态成员函数不能是虚函数。(但是析构函数可以)
多态:这里的多态和java中的不太一样。定义:通过基类指针(或基类引用)去调用基类和派生类中的同名虚函数时,若基类指针引用的是一个基类对象,那么被调用的是基类的虚函数;若基类指针引用的是一个派生类对象,那么被调用的是派生类的虚函数。(而用基类指针调用普通同名函数时,调用的是基类中的函数)
多态实例
- 在非构造函数,非析构函数的成员函数中调用虚函数,是多态。
实例:
class Base{
public:
void fun1() { fun2(); }
//这里的fun2()相当于this->fun2(),而this指针代表的是Base类,是基类指针,因此是多态。所以最后的输出结果是derived
vitural void fun2() { cout << base << endl; }
};
class Derived : public Base{
public:
vitural void fun2() { cout << derived << endl; }
};
int main(){
Derived d;
Base * p = & d;
p->fun1();
//输出结果是 derived
return 0;
}
- 派生类中和基类中虚函数同名同参数表的函数,即使不加
virtual
也自动成为虚函数。 - 在构造函数和析构函数中调用虚函数不是多态,调用的是自己类中定义的函数(如果没有定义,则去调用基类中定义的同名函数)
多态的实现原理
每一个有虚函数的类(或者有虚函数类的派生类)都有一个虚函数表,该类的任何对象中都有虚函数表的指针,因此有虚函数类的对象的内存大小会多出来四个字节,多出来的这四个字节就是虚函数表的指针。
虚析构函数、纯析构函数和抽象类
- 通过基类的指针
delete
派生类的对象时,只会调用基类的析构函数。(而程序自然退出时则会先调用派生类的析构函数,再调用基类的析构函数)要想先调用派生类的析构函数,再调用基类的析构函数,需要把基类的析构函数声明为virtual
(这样派生类的析构函数也会默认变成虚函数),即可达到目的。 - 只要一个类有虚函数,那么就建议将其析构函数写成虚析构函数。
实例:
#include <iostream>
using namespace std;
class Son{
public:
virtual ~Son(){
cout << "bye from son" << endl;
}
};
class GrandSon:public Son{
public:
~GrandSon(){
cout << "bye form grandson" << endl;
}
};
int main(){
GrandSon s;
Son * p = & s;
delete p;
return 0;
}
- 纯虚函数:没有函数体的虚函数
写法举例:virtual void Print() = 0 ;
- 抽象类:包含纯虚函数的类叫做抽象类(用法同java中的抽象类)
- 抽象类只能作为基类来派生新类,不能创建抽象类的对象。
- 在抽象类的成员函数中可以调用纯虚函数,但是在构造函数或析构函数内部不可以调用纯虚函数。
c++学习笔记_6的更多相关文章
- PythonI/O进阶学习笔记_6.对象引用,可变性和垃圾回收
前言: 没有前言了- -......这系列是整理的以前的笔记上传的,有些我自己都忘记我当时记笔记的关联关系了. 记住以后 笔记记了就是用来复习的!!!不看不就啥用没了吗!!! content: 1.p ...
- Java编程思想学习笔记_6(并发)
一.从任务中产生返回值,Callable接口的使用 Callable是一种具有泛型类型参数的泛型,它的类型参数表示的是从方法call返回的值,而且必须使Executor.submit来去调用它.sub ...
- matlab学习笔记8 基本绘图命令-三维绘图
一起来学matlab-matlab学习笔记8 基本绘图命令_6 三维绘图 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 ...
- Learning hard 学习笔记
第一章 你真的了解C#吗 1.什么是C#, 微软公司,面向对象,运行于.NET Framework之上, 2.C#能编写哪些应用程序, Windows应用桌面程序,Web应用程序,Web服务, 3.什 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
随机推荐
- Java8-LongAccumulator
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util ...
- 6、组件注册-@Lazy-bean懒加载
6.组件注册-@Lazy-bean懒加载 懒加载:单实例bean,默认是在容器启动的时候创建对象:懒加载就是启动的是不创建,在第一次使用的时候再创建对象. @Lazy // 单实例下懒加载bean
- Appium自动化测试教程-自学网-adb命令
adb命令: adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信.它可为各种设备操作提供便利,如安装和调试应用. T ...
- 01 | 基础架构:一条SQL查询语句是如何执行的?
这是专栏的第一篇文章,我想来跟你聊聊MySQL的基础架构.我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于MySQL的学习也是这样.平时我们 ...
- php大文件上传
PHP用超级全局变量数组$_FILES来记录文件上传相关信息的. 1.file_uploads=on/off 是否允许通过http方式上传文件 2.max_execution_time=30 允许脚本 ...
- Win内核原理与实现学习笔记2-现代操作系统的基本结构
1.操作系统本属于软件的范畴,但它需要紧密的跟硬件打交道,它为上层应用软件或应用系统提供了一层抽象,专门负责硬件资源的管理和分配.(应用程序不需要跟硬件打交道,它们利用操作系统提供的功能来实现各种任务 ...
- html 刷新更新背景图
需求:每次刷新页面,随机获取背景图 实现方式: 1 通过js动态生成标签 <body> <script type="text/javascript"> va ...
- 学习GeoServer遇到的问题及答案
简介:本文的记录学习GeoServer遇到的问题,如果已有答案将会附上. 1.GeoServer介绍?,功能? GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现,利用 Ge ...
- mongodb高可用部署linux
准备三台服务器,部署方案如下: 1.安装mongodb,详细不用说: 2.创建实例分别创建目录config.configServer.shard1.shard2.shard3.logs,分别存放实例配 ...
- 【Robot Framework 项目实战 03】使用脚本自动生成统一格式的RF自动化用例
背景 虽然大家都已经使用了统一的关键字,但是在检查了一些测试用例之后,还是发现因为大家对RF的熟悉程度不一导致的测试用例颗粒度差异很大的情况:而且在手动方式转化测试用例过程中,有不少工作是完全重复的且 ...