前文:C++之继承探究(九):多态的代价

抽象基类与纯虚函数

  ♠\spadesuit♠ 纯虚函数:虚函数只有声明,函数体=0,就是一个纯虚函数,纯虚函数没有函数体,不需要实现。在子类里实现纯虚函数的具体功能。

  ♠\spadesuit♠ 抽象基类:拥有纯虚函数的类叫做抽象类,抽象类只能作为基类,不能构建对象(可以声明抽象类的指针或引用)。因为抽象类内的纯虚函数没有函数体。

  ♠\spadesuit♠ 抽象类提供了不同种类的子类对象的一个通用接口。

  ♠\spadesuit♠ 纯虚函数被定义在派生类中。如果派生类不重写基类的纯虚函数,则派生类也是一个抽象类。

例:

附上例代码:

//小问学编程
#include<iostream>
using namespace std;
#include<math.h>class Point
{public:Point(double i,double j):x(i),y(j){}void print()const{cout<<"("<<x<<","<<y<<")";}
private:double x;double y;
};//声明一个图形类,作为其他图形的基类
class Figure
{public:Figure(double i=0,double j=0):center(i,j){}Point& location(){return center;}void move(Point p){center=p;//改变圆形的中心点draw();  //调用draw函数对圆形重新绘制}//纯虚函数:虚函数只有声明,没有实现,函数体=0//绘制图形,但并不知道是什么图形,因此并不知道//它的具体实现virtual void draw()=0;//旋转图形,也没有实现virtual void rotate(double)=0;
private:Point center;
};//声明一个圆类,继承自图形类
class Circle:public Figure
{public:Circle(double i=0,double j=0,double r=0):Figure(i,j),radius(r){}void draw()//对父类Figure中的纯虚函数进行实现{cout<<"A circle with center";location().print();//打印圆的中心点cout<<"and radius"<<radius<<endl;}//旋转一个圆,虽然没有任何效果,但rotate函数//也必须实现void rotate(double){cout<<"no effect.\n";}
private:double radius;
};//声明一个正方形,继承自图形类,与圆类的实现基本类似
class Square:public Figure
{public:Square(double i=0,double j=0,double d=0,double a=0):Figure(i,j),side(d),angle(a){}void draw(){cout<<"A square with center ";location().print();cout<<" side length "<<side<<"."<<"The angle between one side and X-axis is "<<angle<<endl;}void rotate(double a){angle+=a;cout<<"The angle between one side and the X-axis is "<<angle<<endl;}//顶点数void vertices(){cout<<"The vertices of the square are: 3\n";}
private:double side;//length of the side 边长double angle;//the angle between a sider and the x-axis//与x轴夹角
};int main()
{Circle c(1,2,3);Square s(4,5,6);Figure* f=&c;//父类指针指向子类对象Figure& g=s; //父类引用指向子类对象//Figure f1  //error不能构造抽象类的对象//f2=new Figure(10,10);f->draw();   //使用父类指针调用虚函数f->move(Point(2,2));g.draw();    //使用父类引用调用虚函数g.rotate(1);g.move(Point(1,1));s.vertices();return 0;
}

运行结果:


C++之继承探究(十一):多重继承、菱形继承、二义性问题及其解决方案

C++之继承探究(十):抽象基类与纯虚函数相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 虚函数,虚基类 与纯虚函数 二

    虚函数    还是先看代码 class A { public:     void funPrint(){cout<<"funPrint of class A"<& ...

  7. 虚函数,虚基类 与纯虚函数 一

    正文 虚基类    在说明其作用前先看一段代码 class A { public:     int iValue; }; class B:public A { public:     void bPr ...

  8. 避免在派生类中重新定义基类的非虚函数

    我们都知道,在基类中定义虚函数的目的是允许派生类拥有相同接口却可以有不同的实现,通过对象的指针或引用来访问虚函数可以实现运行时的多态.这么说来,在派生类中重定义(override)虚函数是没有任何问题 ...

  9. C++中虚继承产生的虚基类指针和虚基类表,虚函数产生的虚函数指针和虚函数表

    本博客主要通过查看类的内容的变化,深入探讨有关虚指针和虚表的问题. 一.虚继承产生的虚基类表指针和虚基类表 如下代码:写一个棱形继承,父类Base,子类Son1和Son2虚继承Base,又来一个类Gr ...

最新文章

  1. 安徽计算机中专学校有哪些,安徽2021年中专学校里面都有什么专业
  2. 一键拼出你的微信好友图片墙!
  3. python导入同目录下的模块_如何从同一目录下的模块导入?
  4. 『每周观察』:“在线抓娃娃”开启新娱乐窗口
  5. Android中使用的数据单位
  6. 微课|Python程序设计开发宝典(5.2.2):默认值参数
  7. 腾讯正式入局中视频领域
  8. STM32F103mini教程学习总结与心得(三)---->中断
  9. PowerMock简单使用
  10. ImportError: No module named _internal
  11. Facebook怎样开发软件:工程师驱动的文化
  12. java语法和python语法的一些区别
  13. CentOS切换网易云镜像
  14. 深雁论坛GhostXP专业装机版 V3.0
  15. PHP:【商城后台管理系统】admin超级管理员后台登录界面部署
  16. 一个arm64国产化工控机工程的移植总结
  17. 电视家海信html安装不了,海信电视怎么安装电视家3.0
  18. 那些你可能不知道的网易云音乐奇技淫巧
  19. 建立student类,在此类中所有数据定义为私有数据变量。并建立一个student对象数组,用附件中的数据进行初始化。计算每个学生三门课程的总分和平均成绩(C++实验)
  20. PC微信逆向:实现自动添加好友分享名片

热门文章

  1. Eclipse中不使用内嵌Maven
  2. 基于JAVA+SpringMVC+Mybatis+MYSQL的商场人员管理系统
  3. JVM的方法区和永久带是什么关系?
  4. Vue.js经典开源项目汇总
  5. Asp.net SignalR
  6. [Luogu] 软件包管理器
  7. Epos消费管理系统复制迁移SQL SERVER 2005数据库
  8. Eclipse 生成WebService客户端代码
  9. 驾考通专业版2011
  10. 类的使用经典案例使用类的成员函数显示时间、找出元素的最大值【C++面向对象编程】