【摘要】

在虚函数与纯虚函数的学习中。要求理解虚函数与纯虚函数的定义,了解虚函数与纯虚函数在实例化上的差异。掌握两者在实现上的必要性。熟悉纯虚函数在子类与孙类的函数类型。本文即针对上述问题展开阐述。

【正文】

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++ 虚函数与纯虚函数 浅析的更多相关文章

  1. c++ 虚函数和纯虚函数

    在你设计一个基类的时候,如果发现一个函数需要在派生类里有不同的表现,那么它就应该是虚的.从设计的角度讲,出现在基类中的虚函数是接口,出现在派生类中的虚函数是接口的具体实现.通过这样的方法,就可以将对象 ...

  2. C++ - 虚基类、虚函数与纯虚函数

    虚基类       在说明其作用前先看一段代码 class A{public:    int iValue;}; class B:public A{public:    void bPrintf(){ ...

  3. C++ Primer--虚函数与纯虚函数的区别

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

  4. C++ 虚函数与纯虚函数

    #include<iostream> #include<string> using namespace std; class A{ public: virtual void f ...

  5. c/c++ 基金会(七) 功能覆盖,虚函数,纯虚函数控制

    1.功能覆盖 ClassA , ClassB ,其中ClassB继承ClassA 类的定义如下面的: #ifndef _CLASSA_H #define _CLASSA_H #include < ...

  6. C++ 虚函数 、纯虚函数、接口的实用方法和意义

    也许之前我很少写代码,更很少写面向对象的代码,即使有写多半也很容易写回到面向过程的老路上去.在写面向过程的代码的时候,根本不管什么函数重载和覆盖,想到要什么功能就变得法子的换个函数名字,心里想想:反正 ...

  7. 【C++】C++中的虚函数与纯虚函数

    C++中的虚函数 先来看一下实际的场景,就很容易明白为什么要引入虚函数的概念.假设我们有一个基类Base,Base中有一个方法eat:有一个派生类Derived从基类继承来,并且覆盖(Override ...

  8. C++中虚函数和纯虚函数的区别与总结

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

  9. C++虚函数与纯虚函数用法与区别(转载)

    1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class) ...

随机推荐

  1. 杭电 2553 N皇后问题 (dfs)

    Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,求出有多少种合 ...

  2. luogu3563 逛公园

    两遍 spfa 然后建立分层图拓扑排序 dp 一下. 写得很差劲.效率很低. 时间复杂度 \(\mathrm{O}(Tnk)\). 参见这里秒懂. #include <iostream> ...

  3. sql模糊查询,解除绑定的单号

    --610007570320-610007571319 1000张 delete from (select t.* from (select t1.bill_code, t1.bind_code, t ...

  4. java数据结构简单点

    java常用的数据结构一 集合框架主要就是Collection和Map: 1.Collection包含了List和Set两大分支. (1)List是一个有序的集合,每一个元素都有它的索引.第一个元素的 ...

  5. 谁才是最强战舰!-From 南京理工大学第八届程序设计大赛(校外镜像),博弈~~

    谁才是最强战舰! Time Limit: 1000MS Memory Limit: 65536KB Description 依阿华来到镇守府的第一件事情,就是找大和solo!然而这并不是什么好消息,说 ...

  6. POJ-3100-Root of the Problem,原来是水题,暴力求解~~~

    Root of the Problem Time Limit: 1000MS   Memory Limit: 65536K               http://poj.org/problem?i ...

  7. 成为七牛云 Contributor -如何贡献 logkit 代码

    logkit 是 Pandora 开源的一个通用的日志收集工具,可以将不同数据源的数据方便的发送到 Pandora 进行数据分析.除了基本的数据发送功能,logkit 还有容错.并发.监控.删除等功能 ...

  8. [POJ1984]Navigation Nightmare

    [POJ1984]Navigation Nightmare 试题描述 Farmer John's pastoral neighborhood has N farms (2 <= N <= ...

  9. bzoj 2337 高斯消元+概率DP

    题目大意: 每条路径上有一个距离值,从1走到N可以得到一个所有经过路径的异或和,求这个异或和的数学期望 这道题直接去求数学期望的DP会导致很难列出多元方程组 我们可以考虑每一个二进制位从1走到N的平均 ...

  10. 【HDOJ6342】Expression in Memories(模拟)

    题意: 给定一个由0123456789+* ?组成的表达式,其中?可以被改为任意其它字符,问修改问号后是否有方案使得表达式合法 len<=5e2,sumlen<=1e5 思路: #incl ...