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

引言

  纯虚函数在C++编程中的地位很重要,其关联到了设计模式中“接口”的概念。

语法

  纯虚函数的语法:

  1、  将成员函数声明为virtual

  2、  后面加上 = 0

  3、  该函数没有函数体

 class <类名>
{
virtual <类型><函数名>(<参数表>) = ;

};

  例如:

 class CmdHandler
{
virtual void OnCommand(char* cmdline) = ;

};

  在许多情况下,在基类中不能对虚函数给出有意义有实现,而把它说明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

抽象类

  含有纯虚函数的类叫做抽象类(纯虚类),抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承层次结构的较上层。

  抽象类不能被实例化,即无法创建该类的对象。

  CmdHandler ch;                    // 编译错误!!

  CmdHandler *p = new CmdHandler();  // 编译错误!!

  在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。

  抽象类的主要作用是将有关的组织在一个继承层次结构中,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的。

抽象类刻画了一组子类的操作接口的通用语义,这些语义也传给子类。一般而言,抽象类只描述这组子类共同的操作接口,而完整的实现留给子类。

抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体类了。

接口

  实际用途:充当“接口函数”

  (相当于Java中的interface语法)

  (用于替代C中的回调函数的用法)

  接口规范:凡是遵循此规范的类,都必须实现指定的函数接口,通常是一系列接口。

  上述定义的抽象类可以理解为:凡是遵循CmdHandler规范的类,都必须实现指定的函数接口:OnCommand()。

一个实例

  需求:用户输入一行命令,按回车完成输入。要求解析命令的输入,并处理之。

  设计

  CmdInput:用于接收用户的输入

  CmdHandler:规定一系列函数接口

     CmdParser:接口的实现,实际用于解析的处理类

说明

可见,CmdInput只接收输入的内容,而CmdParser用于对输入的内容进行解析,两个类各做各的,互不干涉,两者并不知道对方的存在,而是通过抽象类CmdHandler充当“接口”联系起来。

代码

// main.cpp
#include “CmdInput.h”
#include “CmdParser.h”
int main(void)
{
CmdInput CInput;
CmdParser CParser;
CInput.SetHandler(&CParser);
CInput.Run();
return ;
} // CmdHandler.h
/* CmdHandler 接口类*/
class CmdHandler
{
public:
virtual ~CmdHandler() {} // 析构函数声明为 virtual
virtual void OnCommand(char* cmdline) = ; // 纯虚函数
}; // CmdInput.h
#include “CmdHandler.h”
class CmdInput
{
public:
CmdInput();
void SetHandler(CmdHandler* pCHandler);
int Run();
private:
CmdHandler* m_pCHandler;
}; // CmdInput.cpp
#include “CmdInput.h”
CmdInput::CmdInput ()
{
m_pCHandler = NULL;
} void CmdInput:: SetHandler(CmdHandler* pCHandler)
{
m_pCHandler = pCHandler;
} int CmdInput::Run()
{
char cmdline[];
memset(cmdline, , );
while()
{
printf("> "); // 输入
gets(cmdline);
if(strcmp(cmdline, "exit") == ) // 退出
{
break;
}
if(m_handler) // 解析与执行
{
m_handler->OnCommand(cmdline);
}
}
return ;
} // CmdParser.h
#include “CmdHandler.h”
/* MyParser: 一个遵循了CmdHandler接口的类*/
class MyParser : public CmdHandler
{
public:
MyParser();
public:
virtual void OnCommand(char* cmdline); // 函数接口集
private:
int Split(char text[], char* parts[]); // 解析命令
}; // CmdParser.cpp
#include <stdio.h>
#include “CmdParser.h”
CmdParser::CmdParser ()
{
} void CmdParser::OnCommand(char* cmdline)
{
char* argv[];
int argc = Split(cmdline,argv);
if(argc > )
{
printf("命令: %s \n" , argv[]);
printf("参数: ");
for(int i=; i<argc; i++)
{ printf("%s ", argv[i]); }
printf("\n\n");
}
} int CmdParser::Split(char text[], char* parts[])
{
int count = ; // 分段的个数
int start = ; // 每一分段的首地址
int flag = ; // 遍历text,标识当前是否处于有效字符
int stop = ; // 是否到达结束 for(int i=; !stop ; i++)
{
char ch = text[i];
if(ch == )
stop = ; // 结束循环 if(ch == ',' || ch == '\0' || ch == ' ' || ch == '\t' )
{
if(flag) // 遇到分隔符,且当前状态为flag=1
{
flag = ;
text[i] = ; // 修改为结束符,完成分段
parts[count] = text + start; // 记录首地址
count ++;
}
}
else
{
if(!flag) // 遇到有效字符,且当前状态为flag=0
{
flag = ;
start = i;
}
}
}
return count; //返回分段个数
}

小结

  1、  纯虚函数的定义

  2、  抽象类及其实质作用:接口规范,因为它只代表了一个规范,并没有具体实现,所以它不能被实例化。

  3、  抽象类通常被多重继承,例如,一个普通的类,实现了多套接口规范,又继承于原有的父类。

  4、  抽象类的析构函数应该声明为virtual,因为它被涉及用于继承的。

C++基础(纯虚函数与抽象类)的更多相关文章

  1. C++学习基础十二——纯虚函数与抽象类

    一.C++中纯虚函数与抽象类: 1.含有一个或多个纯虚函数的类成为抽象类,注意此处是纯虚函数,而不是虚函数. 2.如果一个子类继承抽象类,则必须实现父类中的纯虚函数,否则该类也为抽象类. 3.如果一个 ...

  2. C++基础 (7) 第七天 多态的原理 纯虚函数和抽象类 依赖倒置原则

    1 昨日回顾 2 多态的原理 1 要有继承 2 要有子类重写父类的虚函数 3 父类指针(或者引用)指向子类对象 (动态联编 虚函数表 3 证明vptr指针的存在 4 vptr指针在构造父类的时候是分步 ...

  3. C++复习:纯虚函数和抽象类

    纯虚函数和抽象类 1基本概念 2抽象类案例   3抽象类在多继承中的应用 C++中没有Java中的接口概念,抽象类可以模拟Java中的接口类.(接口和协议) 3.1有关多继承的说明 工程上的多继承 被 ...

  4. c++-纯虚函数和抽象类

    纯虚函数和抽象类 C面向接口编程和C多态 函数类型语法基础 函数指针做函数参数(回调函数)思想剖析 函数指针做函数参数两种用法(正向调用.反向调用) 纯虚函数 抽象类 抽象类基本概念 抽象类在多继承中 ...

  5. C++:纯虚函数与抽象类

    5.4.3 纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但是要求在派生类中根据需要对它进行定义,或仍然说明为纯虚函数. 声明纯虚函数的一般格式是: virtual 函数 ...

  6. c++,纯虚函数与抽象类

    1.纯虚函数的定义: (1)虚函数被“初始化”为0的函数.声明纯虚函数的一般形式是virtual 函数类型 函数名(参数表列) =0;(2)纯虚函数没有函数体:(3)最后面的“=0”并不表示函数返回值 ...

  7. 简单地说, cpp中的纯虚函数就是抽象类的具体实现

    简单地说, cpp中的纯虚函数就是抽象类的具体实现.包含了纯虚函数的类就是抽象类.

  8. C++开发系列-纯虚函数和抽象类

    概念 纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都实现该函数. 纯虚函数为各派生类提供了一个公共界面(接口的封装和设计.软件的模块功能的划分) 纯虚函数说明 ...

  9. cc32b_demo-32dk2j_cpp_纯虚函数与抽象类2-txwtech

    cc32b_demo-32dk2j_cpp_纯虚函数与抽象类2-txwtech //纯虚函数是用来继承用的//纯虚函数//抽象类-抽象数据类型//*任何包含一个或者多个纯虚函数的类都是抽象类//*不要 ...

随机推荐

  1. 了不起的Node.js读书笔记

    原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 第二章 Js概览 基于GoogleV8引擎 Object.keys(o) 数组方法:遍历forEach.过滤filter ...

  2. RTX二次开发(一)(基于ASP.NET)

    腾讯通RTX是(Real Time eXpert)是腾讯公司推出的企业级实时通信平台,致力于帮助企业提高运作效率.降低沟通成本.拓展商业机会,是一种高度可管理.低成本.易部署的IT平台.RTX集成了丰 ...

  3. 【python网络编程】新浪爬虫:关键词搜索爬取微博数据

    上学期参加了一个大数据比赛,需要抓取大量数据,于是我从新浪微博下手,本来准备使用新浪的API的,无奈新浪并没有开放关键字搜索的API,所以只能用爬虫来获取了.幸运的是,新浪提供了一个高级搜索功能,为我 ...

  4. 巧用jQuery选择器写表单办法总结(提高效率)

    转载自:http://blog.csdn.net/violetjack0808/article/details/52221343 1.文本和文本框 <!DOCTYPE html> < ...

  5. 2015年最有价值的30个响应式WORDPRESS主题

    http://www.chinaz.com/design/2015/0521/408204.shtml 必须承认,Wordpress依然是目前最流行.最易用的内容管理系统,合理地使用Wordpress ...

  6. android Home键和返回键

    在Android中,当按下Home键,默认情况下stop前台的actiity,即activity设置成onstop,而不是ondestory.如果再次启动该activity不是调用onCreate,而 ...

  7. DOM之操作技术

    1.1 动态脚本 动态加载的外部JS文件能够立即运行.难点在于如何知道脚本加载完成了?可以通过事件来检测.IE对待<script>元素特殊性,不允许DOM访问其子节点.使用元素的text属 ...

  8. [COJ0985]WZJ的数据结构(负十五)

    [COJ0985]WZJ的数据结构(负十五) 试题描述 CHX有一个问题想问问大家.给你一个长度为N的数列A,请你找到两个位置L,R,使得A[L].A[L+1].…….A[R]中没有重复的数,输出R- ...

  9. ExtJs xtype类型介绍

    自定义组件在定义的时候可以通过xtype配置为组件指定xtype短名称,此后创建对象可以通过xtype来创建自定义对象了,示例代码如下: Ext.define('MyApp.PressMeButton ...

  10. Android之Toast通知的几种自定义用法

    Toast.makeText(context, str,                 Toast.LENGTH_SHORT).show();     }                       ...