// Vitual_Base.cpp : Defines the entry point for the console application.
//抽象基类与纯虚函数#include "stdafx.h"
#include<stdlib.h>
#include<iostream>using namespace std;class Point
{
private:double x, y;public:Point(double i, double j) :x(i), y(j)//使用参数列表{}void print()const //防止在函数体内修改变量的值{cout << "( " << x << ",  " <<y<<")"<< endl;}
};//声明一个图形类,作为其他类的基类
class Figure//组合类
{
private:Point center;
public:Figure(double i = 0, double j = 0) :center(i, j)//注意复合类初始化与继承类初始化的异同{}Point & location()//为了避免拷贝,不产生临时变量使用引用{return center;}void move(Point p){center = p;//改变图形的中心点draw();//调用draw()函数对图形重新绘制}//纯虚函数:虚函数只有声明,没有实现,函数体=0virtual void draw() = 0;//绘制图形,但不知道是什么图形,因此并不知道他的具体实现virtual void rotate(double) = 0;//旋转函数,也没有实现
};//声明一个类。继承于图形类
class Circle :public Figure//派生类
{
private:double radius;
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;}void rotate(double a)//旋转一个圆,虽然没有任何效果,但必须rotate()函数必须实现{cout << " no effect.\n";}
};
//声明一个正方形类,继承于图形类,与圆的实现基本类似
class Square :public Figure
{
private:double side;//边长double angle;//与x轴的夹角
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 << ".\n"<< " The angle between one side and the 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"; }
};int main()
{Circle  c(1, 2, 3);Square s(4, 5, 6);Figure *f = &c;//父类指针指向子类对象Figure &g = s;Figure aFigure(10,10);//error不能构造抽象类的对象f->draw();f->move(Point(2, 2));g.draw();//使用父类引用调用虚函数g.rotate(1);g.move(Point(1, 1));s.vertices();system("pause");return 0;
}
/*那么子类是不是必须实现基类中所有的纯虚函数?
是:因为子类不实现所有的纯虚函数子类依然是一个抽象类
不是:因为子类拥有了基类的函数,但是纯虚函数没有实现,因此子类必须实现才行
因此:
(1) 纯虚函数:虚函数只有声明,函数体=0,就是一个纯虚函数,纯虚函数没有函数体
,不需要实现,在子类里实现纯虚函数的具体功能(2)抽象基类:拥有纯虚函数的类叫抽象基类,抽象类只能作为基类,不能构建对象,因
为抽象类中的纯虚函数没有函数体,即没有实现部分(3)抽象类提供了不同子类对象的一个通用接口(4)纯虚函数被定义在派生类中,如果派生类不重写基类的纯虚函数,则派生类也是一个
抽象类
*/

												

C++之抽象基类与纯虚函数相关推荐

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

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

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

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

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

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

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

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

  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. 指向派生类对象的基类指针与虚函数

    看如下代码: CSales   aSales("崔贤"); CSales* pSales; CWage* pWager; pSales=&aSales; pWager=&a ...

最新文章

  1. 智能语音简史:这场技术革命从哪开始?
  2. Mac OS Terminal 几个快捷键
  3. 一做就是一天,这一天天的谁受得了
  4. ubuntu16.04设置cron日志
  5. Android经常使用的五种弹出对话框
  6. Vue学习(watch、computed、生命周期、filter)- 学习笔记
  7. CHANGE MASTER TO语法--MySql数据库
  8. C语言源代码展示:常用转换函数实现原理
  9. 向Array中添加二分插入排序
  10. springmvc中实现quartz定时任务
  11. 揭秘:原来腾讯、网易、阿里竟是这样招人的……
  12. APS背景和入门基础
  13. docker日志引擎说明
  14. android studio 登录与注册,Android Studio实现QQ的注册登录和好友列表跳转
  15. 涨知识了,您想知道的光纤常识都在这里了,太详细了,赶紧收藏吧
  16. 一文了解新型AMM方案Caspian,解决L2导致的流动性碎片化问题
  17. ZZULIOJ-1012,求绝对值(Java)
  18. java简单雷电游戏代码_[代码全屏查看]-Java 雷电游戏(完成)
  19. 直接插入排序——监视哨的作用
  20. Bug:eventlet ImportError cannot import name ‘ALREADY HANDLED

热门文章

  1. windows php exec()不生效问题
  2. 单调有界数列一定有极限
  3. java处理文件路径windows与linux兼容问题
  4. win7系统控制面板下的打开或关闭windows功能需要打开哪些功能
  5. keil编译出错关于__use_no_semihosting_swi的使用
  6. framebuffer 保存 bmp图片格式
  7. 各类数据类型的用法java_Java各种数据类型详细介绍及其区别
  8. 近世代数--整环上的唯一分解问题--唯一分解整环中元素的标准分解式
  9. BUUCTF-[网鼎杯 2020 青龙组]singal——angr学习记录
  10. 904. 水果成篮(滑动窗口)模板题