C++基础--虚函数和纯虚函数
虚函数的一种重要的应用是在子类重写父类方法上,一般都是在父类中声明的时候用关键字virtual修饰。
在C++中,一个父类的对象指针是可以指向子类的实例化对象,这个时候可以用该对象指针来访问父类的成员函数,但是访问不了子类的成员函数。如果这个父类的对象指针想要访问子类中的函数,则需要在父类中对应的函数添加virtual关键词将该函数变为虚函数,这个时候父类的对象指针就可以访问子类重写父类虚函数:
#include <iostream>
class A
{
public:
virtual void prt1()
{
std::cout << "A1" << std::endl;
}
void prt2()
{
std::cout << "A2" << std::endl;
}
protected:
private:
};
class B :public A
{
public:
void prt1()
{
std::cout << "B1" << std::endl;
}
void prt2()
{
std::cout << "B2" << std::endl;
}
};
int main(int argc, char* argv[])
{
A *ptrA = NULL;
B *ptrB = new B;
ptrA = ptrB;
ptrA->prt1();
ptrA->prt2();
// delete ptrB; // 这里delete ptrB或者ptrA其中一个就可以了。
delete ptrA;
system("pause");
return 0;
}
代码运行的结果显示如下:

父类A声明了两个函数,prt1是虚函数,prt2是普通的成员函数,子类B继承了父类A,同样有两个函数,prt1是重写了父类的虚函数,prt2是隐藏了父类的普通话成员函数,所以当声明一个父类的对象指针并指向子类的实例化对象的时候,ptrA可以访问B的函数prt1,而访问prt2的时候只能访问父类的prt2函数。
提到虚函数就要提一下纯虚函数,纯虚函数跟虚函数类似,也用virtual来修饰,但是多了一个是在函数最后要添加"=0"来表示纯虚函数,比如这样:
class A
{
public:
virtual void prt0() = 0;
virtual void prt1()
{
std::cout << "A1" << std::endl;
}
void prt2()
{
std::cout << "A2" << std::endl;
}
protected:
private:
};
在上一个例子的类A中添加一个纯虚函数ptr0,这个时候如果类B中没有对ptr0进行重写就实例化一个对象的话,编译的时候会报错,报错类B不能进行实例化。所以要在B类中重写A的纯虚函数后B才能被实例化:
class B :public A
{
public:
void prt0()
{
std::cout << "B0" << std::endl;
}
void prt1()
{
std::cout << "B1" << std::endl;
}
void prt2()
{
std::cout << "B2" << std::endl;
}
};
这样父类的对象指针指向子类的实例化对象的时候,也还可以访问子类重写的纯虚函数的:
int main(int argc, char* argv[])
{
A *ptrA = NULL;
B *ptrB = new B;
ptrA = ptrB;
ptrA->prt0();
ptrA->prt1();
ptrA->prt2();
//delete ptrB;
delete ptrA;
system("pause");
return 0;
}
结果显示如下:

所以纯虚函数的总结如下:
父类声明纯虚函数的时候在函数最后添加"=0",这个时候父类变成抽象类,抽象类不能被实例化;
子类继承重写抽象类的纯虚函数后子类才可以被实例化,并且在声明的时候不需要virtual修饰,但要与被重写的纯虚函数的函数名、参数列表、返回值完全一致,如果返回值则需要是协变的情况,否则会提示重写虚函数返回类型有差异,且不是来自“A::prt0”的协变
抽象类可以有声明为一个指针指向子类的实例化对象,这个时候可以访问被子类重写的虚函数和纯虚函数,但是普通函数不行。
纯虚函数的作用可以说是“只提供申明,没有实现”,是约束子类的接口的方法。
月是情人和鬼的魂魄,
月色冰冰燃一盏青焰的长明灯
中元夜,鬼也醒着,人也醒着
人在桥上怔怔地出神
C++基础--虚函数和纯虚函数的更多相关文章
- C++语言基础(13)-抽象类和纯虚函数
一.基本语法 在C++中,可以将虚函数声明为纯虚函数,语法格式为: ; 纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0,表明此函数为纯虚函数. 最后的=0并不表示函数返回值为0,它只起形 ...
- 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++中虚函数和纯虚函数的区别与总结
首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...
随机推荐
- Day1-D-CF-1144C
简述:给你一个数组,判断是否能拆分成2个数组,一个递增一个递减,若不行输出No,可以就Yes并分别输出 思路:统计每个数出现的次数,若有大于2的肯定无法组成严格单调,这样就只需要将出现两次的组成递,剩 ...
- 前端学习笔记系列一:6 一种新的css预编译器stylus
stylus是 CSS 的预处理框架.CSS 预处理,顾名思义,预先处理 CSS.那 stylus 咋预先处理呢?stylus 给 CSS 添加了可编程的特性,也就是说,在 stylus 中可以使用变 ...
- Mozilla Firefox 68 正式发布下载:对刚Chrome
Mozilla Firefox 68开源和跨平台Web浏览器现在正式发布,可以下载适用于GNU/Linux,Mac和Windows平台的Firefox 68了. Firefox 68网络浏览器现在可以 ...
- 【LeetCode】排列硬币
[问题]你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币.给定一个数字 n,找出可形成完整阶梯行的总行数.n 是一个非负整数,并且在32位有符号整型的范围内. [ ...
- Luogu神贴合辑
1.扩散性百万甜面包 - 陈乙己 2.Unknown_Error - 说句闲话:研究珂学的最好方法是
- 冰蝎动态二进制加密WebShell基于流量侧检测方案
概述 冰蝎是一款新型动态二进制加密网站工具.目前已经有6个版本.对于webshell的网络流量侧检测,主要有三个思路.一:webshell上传过程中文件还原进行样本分析,检测静态文件是否报毒.二:we ...
- 将证书添加到受信任的根证书存储失败,出现以下错误:访问控制列表(ACL)结构无效
问题出现情景: 使用 vs2017 创建一个 ASP.NET Core Web 应用程序 -> Ctrl + F5 运行项目 选择是,但是添加证书失败,是什么原因导致的我不知道,有大佬的知道的话 ...
- Day6 - D - Tree 园丁的烦恼 HYSBZ - 1935
很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: “最近我在思索一个问题, ...
- 从零开始学C++(1 变量和基本类型)
接下来的几篇文章介绍C++的基础知识点. C++是一种静态数据类型语言,它的类型检查发生在编译时.因此,编译器必须知道程序中每一个变量对应的数据类型. 数据类型是程序的基础:它告诉我们数据的意义以及我 ...
- 046、Java中使用if…else判断
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...