【c++】面向对象程序设计之虚函数详解
一、动态绑定什么时候发生
当且仅当通过指针或引用调用虚函数时,才会在运行时解析该调用
二、派生类中的虚函数
当我们在派生类中覆盖了某个虚函数时,可以再一次使用virtual指出该函数的性质,但是这么做并非必须,因为一旦某个函数被声明成虚函数,则在所有派生类中它都是虚函数。
一个派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参类型及返回类型必须与被它覆盖的基类函数完全一致,除非当类的虚函数返回类型是类本身的指针或引用时。
当派生类中某函数与基类的某虚函数名字及形参相同时,此时编译器认为派生类覆盖了这个函数,此时返回类型需一致,除非是上述情况,不然出错。若形参类型不同,这是两个不同的函数。
在c++11标准中我们可以使用override来说明派生类中的虚函数。如果我们使用override标记了某个函数,但该函数并没有覆盖已存在的虚函数,此时编译器将报错。注意:只有虚函数才能被覆盖,覆盖的作用是为了实现多态
class b
{
public:
virtual void f1(int)const;
virtual void f2();
void f3();
}; class d :public b
{
void f1(int) const override;//准确
void f2(int) override;//错误,形参不一致
void f3() override;//错误,f3不是虚函数
};
把某个函数指定为final,则之后任何尝试覆盖该函数的操作将引发错误。
class base
{
public:
virtual void f1(int)const final;
}; class derived :public base
{
public :
void f1(int)const;//出错,f1为final,无法覆盖
};
如果虚函数使用默认实参,则基类和派生类中定义的默认实参最好一致,因为会调用基类的默认实参,默认实参是静态绑定的(前提是通过基类的指针或引用来调用,如果是通过派生类的对象来调用该虚函数,使用的是派生类虚函数中的默认实参)
三、抽象基类
含有纯虚函数的类是抽象基类,我们不能创建抽象基类的对象,如果在抽象基类的派生类中覆盖了纯虚函数,则派生类可以创建对象,否则派生类仍然是抽象类
四、虚析构函数
继承关系对基类拷贝控制最直接的影响是基类通常应该定义一个虚析构函数。当我们delete一个动态分配的对象的指针时将执行析构函数,如果该指针指向继承体系中的某个类型,则有可能出现指针的静态类型与被删除对象的动态类型不符的情况,所以通过在基类中将析构函数定义为虚函数以确保执行正确的析构函数版本。
如果基类的析构函数不是虚函数,则delete一个指向派生类对象的基类指针将产生未定义的行为(可能造成内存泄漏,此时调用基类析构函数,而不是派生类析构函数),而且基类需要虚析构函数,此时并不一定需要拷贝和赋值操作。
【c++】面向对象程序设计之虚函数详解的更多相关文章
- C++ 虚函数详解
C++ 虚函数详解 这篇文章主要是转载的http://blog.csdn.net/haoel/article/details/1948051这篇文章,其中又加入了自己的理解和难点以及疑问的解决过程,对 ...
- C++学习23 虚函数详解
虚函数对于多态具有决定性的作用,有虚函数才能构成多态.上节的例子中,你可能还未发现虚函数的用途,不妨来看下面的代码. #include <iostream> using namespace ...
- SHGetFileInfo函数详解
SHGetFileInfo函数: WINSHELLAPI DWORD WINAPI SHGetFileInfo( LPCTSTR pszPath, DWORD dwFileAttributes, SH ...
- php缓存技术——memcache常用函数详解
php缓存技术——memcache常用函数详解 2016-04-07 aileen PHP编程 Memcache函数库是在PECL(PHP Extension Community Library)中, ...
- 常用socket函数详解
常用socket函数详解 关于socket函数,每个的意义和基本功能都知道,但每次使用都会去百度,参数到底是什么,返回值代表什么意义,就是说用的少,也记得不够精确.每次都查半天,经常烦恼于此.索性都弄 ...
- malloc 与 free函数详解<转载>
malloc和free函数详解 本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...
- NSSearchPathForDirectoriesInDomains函数详解
NSSearchPathForDirectoriesInDomains函数详解 #import "NSString+FilePath.h" @implementation ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- Linux C popen()函数详解
表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * type); 函数说明 popen( ...
随机推荐
- python爬虫(爬取图片)
python爬虫爬图片 爬虫爬校花网校花的图片 第一步 载入爬虫模块 #载入爬虫模块 import re #载入爬虫模块 import requests #载入爬虫模块 第二步 获得校花网的地址,获得 ...
- The US in understimating Huawei, says founder Ren zhengfei
Huawei Founder Ren Zhengfei has downplayed the impact of the US executive order that cripple Huawei' ...
- 数据结构( Pyhon 语言描述 ) — —第10章:树
树的概览 树是层级式的集合 树中最顶端的节点叫做根 个或多个后继(子节点). 没有子节点的节点叫做叶子节点 拥有子节点的节点叫做内部节点 ,其子节点位于层级1,依次类推.一个空树的层级为 -1 树的术 ...
- uboot的readme
## (C) Copyright 2000 - 2008# Wolfgang Denk, DENX Software Engineering, wd@denx.de.## See file CREDI ...
- Linux文件管理类命令及命令别名
文件查看类命令: cat: tac: 从文件尾部开始显示 分屏显示: more [option] 文件名: 查看至文件尾部会退出 空格为翻页 less [option] 文件名: 查看至文件尾部不退出 ...
- 【07】像使用命令行一样使用 GitHub URL
[07] 像使用命令行一样使用 GitHub URL 既然说到了 URL,那么久接着聊一下.使用 UI 浏览 GitHub 很 方面也很好,不过很多时候最快的方式是使用 URL 来浏览.举个例子,如果 ...
- 动态修改字节码以替换用反射调用get set方法的形式
1. 起因 在前两天,为了解决websphere和JDK8上部署的应用发起webservice调用(框架用的cxf)时报错的问题,跟了一些代码,最终发现可以通过加上参数-Dcom.sun.xml.bi ...
- 二丶人生苦短,我用python【第二篇】
1 编码 python解释器在加载 .py 文件中的代码时,对内容默认进行ascill编码,因此存在中文会报错,所以需要告诉python解释器,用什么编码来执行源代码.) ASCII码,主要用于显示现 ...
- 九度oj 题目1536:树的最小高度
题目描述: 给定一棵无向树, 我们选择不同的节点作为根节点时,可以得到不同的高度(即树根节点到叶子节点距离的最大值), 现在求这棵树可能的最低高度. 输入: 输入可能包含多个测试案例. 对于每个测试案 ...
- PHP socket 编程中的超时设置
PHP socket 编程中的超时设置.网上找了半天也没找到.贴出来分享之:设置$socket 发送超时1秒,接收超时3秒: $socket = socket_create(AF_INET,SOCK_ ...