公共接口是指一系列成员函数的集合,支持该接口的类必须以合适的方式重新定义这些成员函数,否则就无法创建对象。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++ 纯虚成员函数+抽象基类相关推荐

  1. C++抽象基类和纯虚成员函数

    公共接口是指一系列成员函数的集合,支持该接口的类必须以合适的方式重新定义这些成员函数,否则就无法创建对象.在C++中,可以通过抽象基类来实现公共接口. 纯虚函数 纯虚成员函数的声明语法如下: virt ...

  2. [C++] - 纯虚函数 抽象基类 接口类

    翻译自:https://www.learncpp.com/cpp-tutorial/126-pure-virtual-functions-abstract-base-classes-and-inter ...

  3. 声明一个哺乳动物类Mammal,再由此派生出狗类Dog,二者都定义Speak()成员函数,基类中定义为虚函数,声明类Dog的一个对象,调用函数Speak()

    #include <iostream.h> #include <string.h> class Mammal { protected:  char name[10]; publ ...

  4. C++中为什么要引入抽象基类和纯虚函数?

    为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ⑴抽象类的定义:带有纯虚函数的类为抽象类. ...

  5. C++引入抽象基类和纯虚函数的作用和目的

    为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 原文链接:https://blog.csdn.net/weibo1230123/article/details/82014322 ...

  6. C++ day24 继承(四)抽象基类,纯虚函数,protected

    文章目录 关键字protected(带来方便同时带来危险,最好不用) 抽象基类和纯虚函数(is-a关系用公有继承实现有时候也不太合适) 用圆和椭圆的笨拙派生为例,挑拨is-a和公有继承的搭档关系 替代 ...

  7. C++之抽象基类与纯虚函数

    // Vitual_Base.cpp : Defines the entry point for the console application. //抽象基类与纯虚函数#include " ...

  8. C++之继承探究(十):抽象基类与纯虚函数

    前文:C++之继承探究(九):多态的代价 抽象基类与纯虚函数   ♠\spadesuit♠ 纯虚函数:虚函数只有声明,函数体=0,就是一个纯虚函数,纯虚函数没有函数体,不需要实现.在子类里实现纯虚函数 ...

  9. python虚函数_Python进阶话题杂谈(十三)纯虚函数与抽象基类

    纯虚函数与抽象类都是Python面向对象中重要的编程范式,用于对继承类做强制性接口实现约定. abc模块包含了一系列与抽象基类与纯虚函数相关的方法.Python中通过修改元类进行抽象基类的设定.这里P ...

最新文章

  1. 索尼将成立200亿日元基金 投资机器人、人工智能等新兴企业
  2. php strtoupper 和 array_change_key_case 字符串转大写,小写
  3. spring boot注释_使用Spring Boot和注释支持配置Spring JMS应用程序
  4. POJ 1323 Game Prediction#贪心
  5. linux下usb驱动配置文件,Linux环境下USB的原理、驱动和配置
  6. 重温C++之“strcpy_s与strcpy的比较”
  7. python与c的联系_Python与C的通信#
  8. 一些同样适用于人生的计算机原理
  9. C++ tbb::atomic
  10. 基于dde-top-panel+tint2+plank+conky的Deepin(深度)桌面美化
  11. gambit多面整合
  12. stm8 低功耗 RTC唤醒
  13. 全面解读“资金二清”与“信息二清”
  14. BAPI_INCOMINGINVOICE_* 预制正向凭证和贷项凭证
  15. VMware View中智能卡和证书身份验证
  16. “智慧南宁”点亮城市生活 “智慧服务”整合信息资源
  17. iphone主屏幕动态壁纸_iPhoneXLivePhoto动态壁纸
  18. 小黑公司团建吃烤肉肉啦,mac m1死活安装不上hbase,用拯救者一下就安上啦的leetcode之旅:865. 具有所有最深节点的最小子树
  19. C/C++ 简单排序之冒泡排序
  20. 一、FreeRTOS简介

热门文章

  1. Plate impulse response spatial interpolation with sub-Nyquist sampling
  2. 迅为i-TOP4412出厂首次烧写
  3. 算法学习之路|住房空置率
  4. linux (ubuntu) 命令学习笔记
  5. [MetalKit]34-Working-with-memory-in-Metal内存管理
  6. spring-retry----线程内重试
  7. 《C++入门经典(第6版)》——1.3 创建您的第一个程序
  8. SQL的主键和外键约束
  9. [Snipaste]系统截图工具
  10. MySql链接字符串 各种程序连接大合集(包括asp.net,c#,等等)