C++ 虚函数与纯虚函数 浅析
【摘要】
在虚函数与纯虚函数的学习中。要求理解虚函数与纯虚函数的定义,了解虚函数与纯虚函数在实例化上的差异。掌握两者在实现上的必要性。熟悉纯虚函数在子类与孙类的函数类型。本文即针对上述问题展开阐述。
【正文】
1)虚函数与纯虚函数有什么差别?
虚函数,不代表函数为不被实现的函数。为了同意用基类的指针来调用子类的这个函数。同意被其子类又一次定义的成员函数。
纯虚函数,代表函数没有被实现,为了实现一个接口,起到一个规范的作用,规范继承这个类的程序猿必须实现这个函数。2)虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并非在编译时刻被确定的。而是在执行时刻被确定的。因为编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数。所以被成为“虚”函数。
3)纯虚函数的定义:
纯虚函数是在基类中声明的虚函数,它在基类中未定义。但要求不论什么派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”virtual void funtion()=0;4)定义纯虚函数的目的:使派生类只不过继承函数的接口。让全部的类对象(主要是派生类对象)都能够运行纯虚函数的动作。但类无法为纯虚函数提供一个合理的缺省实现。所以。类纯虚函数的声明就是在告诉子类的设计者,“你必须提供一个纯虚函数的实现,但我不知道你会如何实现它”。
个别纯虚函数的引入,是出于两个目的
①为了安全,由于。避免不论什么须要明白。可是由于不小心而导致未知的结果,提醒子类去做应做的实现。
②为了效率,不是程序运行的效率。而是为了编码的效率。5)纯虚函数最显著的特征是:它们必须在继承类中又一次声明函数,并且它们在抽象类中往往未定义。
深入总结虚函数和纯虚函数
1)纯虚函数声明例如以下:
virtual
纯虚函数一定未定义,纯虚函数用来规范派生类的行为,即接口。包括纯虚函数的类是抽象类,抽象类不能定义实例,但能够声明指向实现该抽象类的详细类的指针或引用。
void funtion1()=0;2)虚函数声明例如以下:
virtual ReturnType FunctionName(Parameter);
虚函数必须实现,假设不实现。编译器将报错,错误提示为:error
LNK****: unresolved external symbol "public: virtual void __thiscall ClassName::virtualFunctionName(void)"3)对于虚函数来说。父类和子类都有各自的版本号。由多态方式调用的时候动态绑定。
4)实现了纯虚函数的子类,该纯虚函数在子类中就变成了虚函数,子类的子类即孙子类能够覆盖该虚函数。由多态方式调用的时候动态绑定。
5)虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类訪问派生类定义的函数。
6)在有动态分配堆上内存的时候。析构函数必须是虚函数。但没有必要是纯虚的。
7)友元不是成员函数。仅仅有成员函数才干够是虚拟的。因此友元不能是虚拟函数。但能够通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。8)析构函数应当是虚函数,将调用对应对象类型的析构函数,因此,假设指针指向的是子类对象。将调用子类的析构函数,然后自己主动调用基类的析构函数。
【注】
纯虚函数不能实例化一个对象
#include <iostream>
using namespace std;
class Shape
{
public:
Shape(){}
~Shape(){}
virtual void Draw() = 0;
};
int main()
{
Shape s1;
}错误:由于Shape 不能实例化一个对象,所以要改成虚函数 virtual void Draw(){};
C++ 虚函数与纯虚函数 浅析的更多相关文章
- c++ 虚函数和纯虚函数
在你设计一个基类的时候,如果发现一个函数需要在派生类里有不同的表现,那么它就应该是虚的.从设计的角度讲,出现在基类中的虚函数是接口,出现在派生类中的虚函数是接口的具体实现.通过这样的方法,就可以将对象 ...
- C++ - 虚基类、虚函数与纯虚函数
虚基类 在说明其作用前先看一段代码 class A{public: int iValue;}; class B:public A{public: void bPrintf(){ ...
- C++ Primer--虚函数与纯虚函数的区别
首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...
- C++ 虚函数与纯虚函数
#include<iostream> #include<string> using namespace std; class A{ public: virtual void f ...
- c/c++ 基金会(七) 功能覆盖,虚函数,纯虚函数控制
1.功能覆盖 ClassA , ClassB ,其中ClassB继承ClassA 类的定义如下面的: #ifndef _CLASSA_H #define _CLASSA_H #include < ...
- C++ 虚函数 、纯虚函数、接口的实用方法和意义
也许之前我很少写代码,更很少写面向对象的代码,即使有写多半也很容易写回到面向过程的老路上去.在写面向过程的代码的时候,根本不管什么函数重载和覆盖,想到要什么功能就变得法子的换个函数名字,心里想想:反正 ...
- 【C++】C++中的虚函数与纯虚函数
C++中的虚函数 先来看一下实际的场景,就很容易明白为什么要引入虚函数的概念.假设我们有一个基类Base,Base中有一个方法eat:有一个派生类Derived从基类继承来,并且覆盖(Override ...
- C++中虚函数和纯虚函数的区别与总结
首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...
- C++虚函数与纯虚函数用法与区别(转载)
1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class) ...
随机推荐
- Java:追加文件内容
文章来源:https://www.cnblogs.com/hello-tl/p/9139367.html import java.io.*; public class FileBasicOperati ...
- php 快速导出大量CSV文件
原文链接 https://segmentfault.com/a/1190000005366832 /** * 导出excel(csv) * @data 导出数据 * @headlist 第一行,列名 ...
- ActiveMQ windows安装
下载ActiveMQ 官方网站:http://activemq.apache.org/ 下载,解压缩 以前台安装 ctiveMQ默认使用的TCP连接端口是61616, 通过查看该端口的信息可以测试Ac ...
- shell for mysql backup in linux
今天上班只有一台linux系统,就学着在linux上写了个脚本,没啥技术含量 省得每天敲代码备份 没有设置自动备份时间,这里可以参照 http://www.th7.cn/db/mysql/201305 ...
- 在mysql的操作界面中,如何清屏幕
1.快捷键:Ctrl+L2.通过执行SHELL命令: \! clear实际上 \! 用来执行操作系统的shell命令,不仅是clear,其他命令也可以.shell命令执行完成后,会返回mysql Us ...
- Python2和Python3共存安装robotframework
1.下载Python2.Python3安装包 https://www.python.org/ 2.下载pip.tar.gz https://pypi.python.org/pypi/pip#downl ...
- HDU1166-敌兵布阵,线段数模板题~~
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 《Docker容器与容器云》读书笔记
云计算平台 云计算是一种资源的服务模式,该模式可以实现随时随地.便捷按需地从可配置计算资源共享池中获取所需资源(如网络.服务器.存储.应用及服务),资源能够快速供应并释放,大大减少了资源管理工作开销. ...
- nginx配置文件解答
nginx配置文件详解: server { listen 80; servername www.nginx1.com location / { root ...
- Euclidean Nim(bzoj 4147)
Description Euclid和Pythagoras在玩取石子游戏,一开始有n颗石子. Euclid为先手,他们按如下规则轮流操作: ·若为Euclid操作,如果n<p,则他只能新放入p颗 ...