c++ 纯虚成员函数+抽象基类
公共接口是指一系列成员函数的集合,支持该接口的类必须以合适的方式重新定义这些成员函数,否则就无法创建对象。C++ 中可以通过抽象基类来实现公共接口,为了介绍抽象基类,我们需要先来了解一下纯虚成员函数。
virtual 函数返回类型 函数名 (函数参数) = 0;
纯虚成员函数没有函数体,只有函数声明,在纯虚函数声明结尾加上“=0”表明此函数为纯虚成员函数。
包含纯虚成员函数的类即为抽象基类,之所以说它抽象,那是因为它无法实例化,也即无法用于创建对象。
#include<iostream>
using namespace std;
class base
{public :virtual void display() = 0;//......
};
int main()
{base b; //compile errorreturn 0;
}
如本例所示,本例中只定义了一个 base 类,该类中声明了一个纯虚成员函数,包含纯虚成员函数的类即为抽象基类,因此 base 类为抽象基类。抽象基类是无法用于创建对象的,而主函数中我们尝试创建 base 类的对象,这是不允许的,编译提示语法错误。
纯虚成员函数可以被派生类继承,如果派生类不重新定义抽象基类中的所有(有多个则要重新定义多个)纯虚成员函数,则派生类同样会成为抽象基类,也不能用于创建对象。
【例 2】
#include <iostream>
using namespace std;class base{public:base(){x=0;}base(int a){x=a;}virtual void display()=0;int getx(){return x;}private:int x;
};class derived1:public base{public:derived1(int a ){y=a;}private:int y;
};class derived2 :public base
{public:derived2(int a,int b):base(a){z=b;}void display(){cout<<getx()<<" "<<endl;}private:int z;
};int main()
{//base b; //compile error//derived1 d1(5); //compile errorderived2 d2(5,6);d2.display();return 0;
}
在本例中定义了三个类:
base 类中有一个整型成员变量 x、两个构造函数、一个 getx() 普通成员函数和一个 display() 纯虚成员函数。
derived1 类继承自 base 类,该类中新增一个整型的成员变量 y,并且定义了一个构造函数。
derived2 类也继承自 base 类,该类同样新增了一个整型的成员变量 z,并且定义了一个带参的构造函数,还显式调用了基类中的构造函数。除此之外,derived2 类还重新定义了基类中的纯虚成员函数 display(),派生类中的 display() 函数与基类中的纯虚成员函数构成函数覆盖。
再来看一下主函数中的情况:
首先尝试创建 base 类的对象,因为 base 类包含一个纯虚成员函数,所以是抽象基类,不能创建对象;
又尝试创建 derived1 的对象,derived1 类继承了基类 base 中的纯虚成员函数,并且没有重新定义该函数,因此 derived1 类虽然是 base 类的派生类,但它仍然是抽象基类,因此同样不能创建对象。
最后尝试创建 derived2 类的对象,该类同样是 base 类的派生类,同样从 base 类中继承了纯虚成员函数 display()。但是,该类中重新定义了 display() 函数,覆盖了基类的 display() 纯虚成员函数,因此该类不是抽象基类,可以创建对象。创建 derived2 类的对象时调用了类中的带参构造函数,之后通过对象调用 display() 函数,打印出成员变量 x 和 y 的值。
c++ 纯虚成员函数+抽象基类相关推荐
- C++抽象基类和纯虚成员函数
公共接口是指一系列成员函数的集合,支持该接口的类必须以合适的方式重新定义这些成员函数,否则就无法创建对象.在C++中,可以通过抽象基类来实现公共接口. 纯虚函数 纯虚成员函数的声明语法如下: virt ...
- [C++] - 纯虚函数 抽象基类 接口类
翻译自:https://www.learncpp.com/cpp-tutorial/126-pure-virtual-functions-abstract-base-classes-and-inter ...
- 声明一个哺乳动物类Mammal,再由此派生出狗类Dog,二者都定义Speak()成员函数,基类中定义为虚函数,声明类Dog的一个对象,调用函数Speak()
#include <iostream.h> #include <string.h> class Mammal { protected: char name[10]; publ ...
- C++中为什么要引入抽象基类和纯虚函数?
为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ⑴抽象类的定义:带有纯虚函数的类为抽象类. ...
- C++引入抽象基类和纯虚函数的作用和目的
为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 原文链接:https://blog.csdn.net/weibo1230123/article/details/82014322 ...
- C++ day24 继承(四)抽象基类,纯虚函数,protected
文章目录 关键字protected(带来方便同时带来危险,最好不用) 抽象基类和纯虚函数(is-a关系用公有继承实现有时候也不太合适) 用圆和椭圆的笨拙派生为例,挑拨is-a和公有继承的搭档关系 替代 ...
- C++之抽象基类与纯虚函数
// Vitual_Base.cpp : Defines the entry point for the console application. //抽象基类与纯虚函数#include " ...
- C++之继承探究(十):抽象基类与纯虚函数
前文:C++之继承探究(九):多态的代价 抽象基类与纯虚函数 ♠\spadesuit♠ 纯虚函数:虚函数只有声明,函数体=0,就是一个纯虚函数,纯虚函数没有函数体,不需要实现.在子类里实现纯虚函数 ...
- python虚函数_Python进阶话题杂谈(十三)纯虚函数与抽象基类
纯虚函数与抽象类都是Python面向对象中重要的编程范式,用于对继承类做强制性接口实现约定. abc模块包含了一系列与抽象基类与纯虚函数相关的方法.Python中通过修改元类进行抽象基类的设定.这里P ...
最新文章
- 索尼将成立200亿日元基金 投资机器人、人工智能等新兴企业
- php strtoupper 和 array_change_key_case 字符串转大写,小写
- spring boot注释_使用Spring Boot和注释支持配置Spring JMS应用程序
- POJ 1323 Game Prediction#贪心
- linux下usb驱动配置文件,Linux环境下USB的原理、驱动和配置
- 重温C++之“strcpy_s与strcpy的比较”
- python与c的联系_Python与C的通信#
- 一些同样适用于人生的计算机原理
- C++ tbb::atomic
- 基于dde-top-panel+tint2+plank+conky的Deepin(深度)桌面美化
- gambit多面整合
- stm8 低功耗 RTC唤醒
- 全面解读“资金二清”与“信息二清”
- BAPI_INCOMINGINVOICE_* 预制正向凭证和贷项凭证
- VMware View中智能卡和证书身份验证
- “智慧南宁”点亮城市生活 “智慧服务”整合信息资源
- iphone主屏幕动态壁纸_iPhoneXLivePhoto动态壁纸
- 小黑公司团建吃烤肉肉啦,mac m1死活安装不上hbase,用拯救者一下就安上啦的leetcode之旅:865. 具有所有最深节点的最小子树
- C/C++ 简单排序之冒泡排序
- 一、FreeRTOS简介
热门文章
- Plate impulse response spatial interpolation with sub-Nyquist sampling
- 迅为i-TOP4412出厂首次烧写
- 算法学习之路|住房空置率
- linux (ubuntu) 命令学习笔记
- [MetalKit]34-Working-with-memory-in-Metal内存管理
- spring-retry----线程内重试
- 《C++入门经典(第6版)》——1.3 创建您的第一个程序
- SQL的主键和外键约束
- [Snipaste]系统截图工具
- MySql链接字符串 各种程序连接大合集(包括asp.net,c#,等等)