1:包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数。抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针。在程序开发过程中并不是所有代码都是由软件构造师自己写的,有时候需要调用库函数,有时候分给别人写。一名软件构造师可以通过纯虚函数建立接口,然后让程序员填写代码实现接口,而自己主要负责建立抽象类。

2:纯虚函数

纯虚函数是指被标明为不具体实现的虚成员函数,它不具备函数的功能。许多情况下,在基类中不能给虚函数一个有意义的定义,这时可以在基类中将它声明为纯虚函数,而实现留给派生类去做。纯虚函数不能被直接调用,而仅起到提供一个与派生类已知的接口的作用。

声明纯虚函数的形式为:

virtual 类型 函数名(参数列表)=0;

纯虚函数不可以被继承。当基类是抽象类时,在派生类中必须给出基类中纯虚函数的定义,或在该类中再将其声明为纯虚函数。只有在派生类中给出了基类中所有纯虚函数的实现时,该派生类才不再称为抽象类。

3:创建纯虚函数的示例代码如下:

// 8.9.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
using namespace std;
class CFigure
{
public:
virtual double getArea() =;
};
const double PI=3.14;
class CCircle : public CFigure
{
private:
double m_dRadius;
public:
CCircle(double dR)
{
m_dRadius=dR;
}
double getArea()
{
return m_dRadius*m_dRadius*PI;
}
};
class CRectangle : public CFigure
{
protected:
double m_dHeight,m_dWidth;
public:
CRectangle(double dHeight,double dWidth)
{
m_dHeight=dHeight;
m_dWidth=dWidth;
}
double getArea()
{
return m_dHeight*m_dWidth;
}
};
void main()
{
CFigure *fg1;
fg1= new CRectangle(4.0,5.0);
cout << fg1->getArea() << endl;
delete fg1;
CFigure *fg2;
fg2= new CCircle(4.0);
cout << fg2->getArea() << endl;
delete fg2;
}

运行结果:

程序中定义了矩形类CRectangle和圆形类CCircle,两个类都派生于图形Cfigure。图形类是一个在现实生活中不存在的对象,抽象类面积计算方法不确定,所以,将图形类CFigure的面积计算方法设置为纯虚函数,这样圆形有圆形面积的计算方法,矩形有矩形面积的计算方法,每个继承自Cfigure类的对象都有自己的面积,通过getArea成员函数就可以获取面积值。

C++入门经典-例8.9-抽象类,纯虚函数,创建纯虚函数的更多相关文章

  1. C++入门经典-例7.6-this指针,同一个类的不同对象数据

    1:对于类的非静态成员,每个对象都有自己的一份拷贝,即每个对象都有自己的数据成员,不过成员函数却是每个对象共享的.那么调用共享的成员函数如何找到自己的数据成员呢?答案是通过类中隐藏的this指针. 2 ...

  2. C++入门经典-例8.10-实现抽象类中的成员函数

    1:抽象类通常作为其他类的父类,如果从抽象类派生的子类是抽象类,则子类必须实现父类中的所有纯虚函数.代码如下: // 8.10.cpp : 定义控制台应用程序的入口点. // #include &qu ...

  3. C++入门经典-例7.10-运算符的重载,重载加号运算符

    1:曾经介绍过string类型的数据,它是C++标准模版库提供的一个类.string类支持使用加号“+”连接两个string对象.但是使用两个string对象相减确实非法的,其中的原理就是C++所提供 ...

  4. C++入门经典-例6.12-使用数组地址将二维数组输出

    1:以a[4][3]为例 a代表二维数组的地址,通过指针运算符可以获取数组中的元素 (1)a+n代表第n行的首地址 (2)&a[0][0]既可以看作第0行0列的首地址,同样也可以被看作是二维数 ...

  5. C++入门经典-例9.5-为具体类型的参数提供默认值

    1:默认模板参数是指类模板中由默认的数据类型作为参数的参数,在模板定义时,还可以为默认的数据类型声明,变量,并为变量赋值.代码如下: // 9.5.cpp : 定义控制台应用程序的入口点. #incl ...

  6. C++入门经典-例9.4-默认模板参数

    1:默认模板参数就是在类模板定义时设置类型形式参数表中的一个类型参数的默认值,该默认值是一个数据类型.有了默认的数据类型参数后,在定义模板的新类型时就可以不进行指定.代码如下: // 9.4.cpp ...

  7. C++入门经典-例9.3-类模板,简单类模板

    1:使用template关键字不但可以定义函数模板,而且可以定义类模板.类模板代表一族类,它是用来描述通用数据类型或处理方法的机制,它使类中的一些数据成员和成员函数的参数或返回值可以取任意数据类型.类 ...

  8. C++入门经典-例9.2-重载函数模板,求出字符串的最小值

    1:整形数和实型数编译器可以直接进行比较,所以使用函数模板后也可以直接进行比较,但如果是字符指针指向的字符串该如何处理呢?这时可以通过重载函数模板来实现.通常字符串需要库函数来进行比较,通过重载函数模 ...

  9. C++入门经典-例9.1-函数模板,函数模板的作用,使用数组作为模板参数

    1:函数模板不是一个实在的函数,因此编译器不能为其生成可执行的代码.定义函数模板只是一个对函数功能框架的描述,在具体执行时,将根据传递的实际参数决定其功能. 2:函数模板定义的一般形式如下: temp ...

随机推荐

  1. opencv 单目标模板匹配(只适用于模板与目标尺度相同)

    #include <iostream> #include "opencv/cv.h" #include "opencv/cxcore.h" #inc ...

  2. 用帝国cms 反馈内容的时候自动发送邮箱开发流程

    开发流程是这样的. 第一步:先找好一个发送的邮箱.以及一个接受的邮箱.这里是 测试的,我都用的qq邮箱,帝国cms后台配置如下: 注意:这里的SMTP服务器是腾讯的,如果你用163的或者其他的请自行百 ...

  3. Centos6.8 rabbitmq搭建且修改默认端口

    一.安装依赖环境 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ ...

  4. SQLServer 主键插入

    设置此命令后可以往主键插入值 set IDENTITY_INSERT 表名 on set IDENTITY_INSERT 表名 off 注意: 此语句是一个整体操作 反例: 先单步执行:set IDE ...

  5. 单点登录系统SSO实现

    前些天被问到单点登录了,而据我当时做的这个模块两年了,现在重新温习并记录下,方便以后快速回忆起来 一.什么是单点登录系统 SSO全称Single Sign On.SSO是用户只需要登录一次就可以访问所 ...

  6. python中的负数取模问题(一个大坑)

    先来看一段代码 这是什么情况?为什么会出现这种结果.我们再来看看其它语言的执行结果 我们用golang.js.c分别算了一下,结果得到的结果都是一致的,但是python为啥不一样呢? 其实之所以这么做 ...

  7. Python 编解码

    字符串编码常用类型:utf-8,gb2312,cp936,gbk等. python中,我们使用decode()和encode()来进行解码和编码 在python中,使用unicode类型作为编码的基础 ...

  8. CSS基础学习-13.CSS 浮动

    如果前一个元素设置浮动属性,则之后的元素也会继承float属性,我觉得这里说是继承不太对,可以理解为会影响到之后的元素,所以在设置浮动元素之后的元素要想不被影响就需要清除浮动.元素设置左浮动,则清除左 ...

  9. pycharm运行程序,总是出现IPthony界面(IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help. PyDev console: using IPython 6.2.1)

    解决方式如下: 取消即可.

  10. python读取csv文件的某一列或某几列

    import csvimport pandas as pd with open('D:\Data\新建文件夹\list3.2.csv','r') as csvfile: reader = csv.re ...