探讨虚函数与纯虚函数的区别

2024-03-10 02:38
文章标签 函数 区别 探讨 纯虚

本文主要是介绍探讨虚函数与纯虚函数的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载请注明t1234xy4原创:http://blog.csdn.net/t1234xy4/article/details/51191270
《C++ Primer》书上学习得到的基础:
纯虚函数:
1、纯虚函数只声明,没有定义。书写=0说明为纯虚函数。
2、含有纯虚函数的内,称为抽象基类,所谓抽象基类只负责定义接口,后续的其他类可以覆盖该接口,我们不能创建抽象基类的实例。
3、能够被覆盖。

普通虚函数:
1、声明为普通函数前加virtual,不仅要申明,而且必须定义。
2、能够被覆盖。(只有虚函数能够被覆盖)

测试虚函数与纯虚函数区别:
测试1、测试纯虚函数能不能有重名而函数个数不同的重载:
//virtualBase.hxx:

#include <string>
#include <iostream>
#pragma once
using namespace std;
class VirtualBase
{
public:VirtualBase(void);virtual void  helloword(string s)=0;virtual void helloword(string s1,string s2)=0;~VirtualBase(void);
};

virtualclass 继承了virtualBase

VirtualClass.hxx :

#pragma once
#include "virtualbase.h"
#include "VirtualBaseCopy.h"
class VirtualClass :public VirtualBase/*,public VirtualBaseCopy*/
{
public:VirtualClass(void);virtual void helloword(string s);virtual void helloword(string s1,string s2);~VirtualClass(void);
};

virtualclass.c

#include "StdAfx.h"
#include "VirtualClass.h"void VirtualClass::helloword(string s1,string s2)
{cout << "VirtualClass: hello ,"<<s1 <<","<<s2<<endl;
}
void VirtualClass::helloword(string s)
{cout << "virtualclass: hello,"<<s<<endl;
}

Main.c:

int _tmain(int argc, _TCHAR* argv[])
{**VirtualBase *base = new VirtualClass; //注意此处**string s = "jack";string s2 = "rose";base->helloword(s,s2);base->helloword(s);while (1){}return 0;
}

执行结果如下:
这里写图片描述
测试1结论:如果基类拥有重载纯虚函数接口,子类分别实例化后可用。也就是说,子类重写的两个函数分别覆盖了基类的两个函数。

测试2:如果基类VirtualBase中只有其中一个接口?,子类中是否可以出现同名的函数。
修改VirtualBase.hxx如下:

#include <string>
#include <iostream>
#pragma once
using namespace std;
class VirtualBase
{
public:VirtualBase(void);//virtual void  helloword(string s)=0;virtual void helloword(string s1,string s2)=0;~VirtualBase(void);
};
int _tmain(int argc, _TCHAR* argv[])
{**VirtualClass *base = new VirtualClass;**//注意此处string s = "jack";string s2 = "rose";base->helloword(s,s2);base->helloword(s);//cout<<base->add(2,3);while (1){}return 0;
}

结果:
这里写图片描述

修改为下面的后:

**VirtualBase *base = new VirtualClass;**//注意此处

编译不通过。
测试2结论:
1、编译不通过在情理之中,基类的指针开辟的空间结构不具有另一个函数的指针。
2、helloword(string s1,string s2)是VirtualClass的虚函数可行,运行没有问题。也就是说,子类可以出现与父类接口同名的函数。

虚函数是可以连续继承的。也就是说,一个函数在基类中为虚函数,那么在他的子子孙孙类中都是虚函数。

测试3: VirtualClass的子类还能否够继承他
我们添加类VirtualConcreate继承VirtualClass类,并重写虚函数helloword(string s):

void VirtualConcreate::helloword(string s)
{cout<<"concrete:hello,"<<s<<endl;
}

实例化如下:

**VirtualBase *base = new VirtualConcreate;**

结果如下:
这里写图片描述

测试3结论如下:
1、如果在VirtualConcrete类中,函数中重写了父类的虚函数,那么父类的虚函数将被覆盖掉;
2、子类中没有重写的父类函数,直接调用父类函数;

测试4:基类的接口,在其派生类中出现了与接口同名(函数个数不同或者参数不同)的虚函数是否一起被继承。
这里写图片描述
测试4结论:可以一起被继承。

测试总结:虚函数也可用重载,纯虚函数一样可以重载。,只有形参类型完全相同的虚函数才会被覆盖!!

测试5:普通成员函数与虚函数区别。
虚函数:
1、只有虚函数才能被覆盖(《C++ primer(第5版)》 538页)
2、虚函数是动态绑定

成员函数:
1、成员函数是静态绑定

这篇关于探讨虚函数与纯虚函数的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/792752

相关文章

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

MySQL中VARCHAR和TEXT的区别小结

《MySQL中VARCHAR和TEXT的区别小结》MySQL中VARCHAR和TEXT用于存储字符串,VARCHAR可变长度存储在行内,适合短文本;TEXT存储在溢出页,适合大文本,下面就来具体的了解... 目录一、VARCHAR 和 TEXT 基本介绍1. VARCHAR2. TEXT二、VARCHAR

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

python中的高阶函数示例详解

《python中的高阶函数示例详解》在Python中,高阶函数是指接受函数作为参数或返回函数作为结果的函数,下面:本文主要介绍python中高阶函数的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录1.定义2.map函数3.filter函数4.reduce函数5.sorted函数6.自定义高阶函数

Python中的sort方法、sorted函数与lambda表达式及用法详解

《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

Python Excel 通用筛选函数的实现

《PythonExcel通用筛选函数的实现》本文主要介绍了PythonExcel通用筛选函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录案例目的示例数据假定数据来源是字典优化:通用CSV数据处理函数使用说明使用示例注意事项案例目的第一

python中getsizeof和asizeof的区别小结

《python中getsizeof和asizeof的区别小结》本文详细的介绍了getsizeof和asizeof的区别,这两个函数都用于获取对象的内存占用大小,它们来自不同的库,下面就来详细的介绍一下... 目录sys.getsizeof (python 内置)pympler.asizeof.asizeof

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法