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】Class文件编译的版本号与JDK版本号的对应关系
查看方式 使用文本编辑器EmEditor以16进制方式打开.class文件 图中红框中的代表版本号52.0 次版本号:00 00 (小数点后面的部分) 主版本号:00 34 (小数点前面的部分 ...
- POJ 3310 Caterpillar(图的度的判定)
题意: 给定一幅图, 问符不符合一下两个条件: (1) 图中没有环 (2)图中存在一条链, 点要么在链上, 要么是链上点的邻居. 分析: 建图,记录度数, 去掉所有度为1的点, 然后看看剩下是否是有2 ...
- c++值传递和引用及指针传递区别
以下程序各有何问题? ***************************************************************************************** ...
- Android开发——使用ADB Shell命令实现模拟点击(支付宝自动转账实现)
首先声明,本人反对一切利用技术的违法行为 本文的实现代码已经销毁,本文以介绍流程为主 1.这里所说的模拟点击不是在自己的APP里点击,点自己APP上的控件没什么好说的 不仅是支付宝转账,其他的获取别人 ...
- 数组和String几种方法的需要注意的地方
array的方法总结 会更改原来的的数组 push.unshift方法,返回length.增加值得就返回length,其他返回该元素 pop,shift返回该元素 reverse返回该元素 splic ...
- centos7安装rlwrap
http://utopia.knoware.nl/~hlub/uck/rlwrap/ 下载rlwrap-0.42.tar.gz 找到centos7 安装的iso中的 Packages的 ncurses ...
- 【状压DP】OpenJ_POJ - C17K Lying Island
https://vjudge.net/contest/171652#problem/K [题意] 小岛上有n个人,有些是好人(一定是真话),有些是坏人(可能是真话也可能是假话),现在要判断最多有多少好 ...
- hdu 1043 A*
http://www.cnblogs.com/183zyz/archive/2011/08/12/2135827.html #include<stdio.h> #define N 3630 ...
- Foundation框架的一些实用方法:替换字符串,去空格,反转
//定义一个可变字符串, Format后面可以跟字符串类型,也可以传入C语言的字符串数组 NSMutableString *str = [NSMutableString stringWithForma ...
- HDU 3527 SPY
http://poj.org/problem?id=3615 基础题 狂STL #include <bits/stdc++.h> using namespace std; set<s ...