C++的中抽象

在C++中,以类、虚函数等为代表的数据抽象功能一直是C++的核心和难点。这里我想结合自己的使用经验,谈谈对C++中抽象的一点浅薄看法!

我认为C++的抽象应该是指:从我们需要解决的问题出发,在与该问题相关的一组关联对象中提取出主要的或共有的部分――说简单一点,就是用相同的行为来操作不同的对象。

从提出问题到找出与该问题相关的对象,这是一个互动的、反复的过程。在对相关对象的抽象中,随着认识的深入,我们可能会修改最初的目标,而最初目标的修改又可能使一组新的相关对象被加入进来。如:假设现在要设计一个基于广域网的邮件服务器,首先可能需要通过socket对底层协议进行封装,为高层的pop3、smtp协议提供一组标准的接口。开始为了使问题简化我们可能计划只封装TCP/IP协议,不过基于以下两点我们有理由修改最初的需求:

1、pop3、smtp需要的底层接口很简单。除了连接,仅需要发送、接收一块数据的功能

2、用socket进行网络编程,大多数常见协议间的差别很小,有许多都仅仅只是初始化和连接不同而已我们只需要做很小的努力就可以兼容大多数常用协议(如:ATM、Ipx、红外线协议等)。

现在决定修改需求,除了TCP/IP协议,还要支持一些其他的的常用协议。通过对最初目标的修改,除了TCP/IP协议对象,又会有一组相关的协议对象被加入进来。我们可以很容易从这组相关对象中提出共有的部分,将他抽象到另一个公共对象中。当然,根据具体应用环境不同,这可能并不是最佳方案。

C++中常规的抽象是在一组相互间有“血缘”关系的类中展开的。如:

Class Parent
{
virtual ~Parent(){};
virtual void GetValue(){ .... };
virtual void Test(){ ... };
};
class child1 : public parent
{
virtual ~child1(){};
virtual void GetValue(){...};
virtual void Test(){ ... } const;
};
class child2 : public parent
{
virtual ~child2(){};
virtual void GetValue(){...};
virtual void Test(){ ... } ;
};

(顺便说一句,child1::Test() const 不是基类 parent::Test() 的重载。)

由上可总结出C++中抽象的一些基本特点:

1、被抽象对象必须直接或间接派生至某个类对象

2、如果你不用没有类型安全的操作,如:向下转型操作或强制类型转化操作(像COM那样)。那么派生类中需要抽象的动作必须在某个基类中出现。

3、基类的析构函数必须是一个虚函数(嗯.... 有点无赖!)

................

时间: 2024-11-03 21:52:05

C++的中抽象的相关文章

Java千百问_05面向对象(003)_java中抽象概念如何体现的

点击进入_更多_Java千百问 1.抽象是什么 抽象,和具体对立,定义了事物的性质,事物的性质会随着抽象概念的改变而改变. 2.java中的抽象类是什么 Java中最直接抽象概念的应用就是抽象类和接口,这里我们看一下抽象类. 抽象类和普通类一样,是一个模版.相比普通类,抽象类不具备实例化对象的能力.抽象类也可以定义属性和方法,比之普通类,它还可以定义没有实现的方法,即抽象方法.  通常会用一个具体类(子类)继承抽象类(父类),实现抽象类中的抽象方法.父类包含子类的集合的通用功能,但父类本身过于抽

android中抽象公共类,复用公共方法为多个对象

今天学习如何实现愤怒的小鸟,用到了JBox2D构建物理世界(这个不是这篇文章重点,但是很谢谢这个开源玩意) 一般一个独立的物体的实体类 import org.jbox2d.dynamics.Body; import org.liky.angrybird.util.Globals; import org.liky.angrybird.util.ImageUtils; import android.graphics.Canvas; import android.graphics.Paint; imp

抽象工厂模块在开发中的应用

抽象工厂是设计模块中创建型模式的一种,它比起工厂方法模式来说,更加具有一般性,在本模式中会引入一个产品族的概念,就是说,在本模式中抽象产品会有多个,然后用抽象工厂去调用它们,具体怎么去调用由具体工厂来实现. 看下列代码,主要实现动态生成按钮和弹出窗口的功能,弹出窗口可以根据浏览器的类型去调用适合 自己的方法,按钮也可以根据传入的样式和类型去自动生成按钮. class Program { static void Main(string[] args) { RunEnvironment run=ne

C# 设计模式----抽象工厂模式

原文地址:C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是

[C#]中abstract类和interface概念和区别讲解

  abstract(抽象)类和interface(接口)是面向对象编程中两个概念,但是学了很多年编程的程序员有时对这两个概念的区分仍然不是很清楚.下面就讲解abstract类和interface的概念和区别. abstract(抽象)类 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法. 抽象类不能被实例化. 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类. 具体派生类必须覆盖基类的抽象方法. 抽象派生类可以覆盖基类的抽象方法,也可以不

探索JSF框架中使用的设计模式

js|设计 设计模式可以帮助用户在更高层次上抽象细节,更好地理解体系结构.如果比较熟悉 GoF 设计模式和 JavaServer Faces (JSF) 框架,本文可以帮助您洞察 JSF 框架中使用的设计模式,深入理解其工作原理. 本文探讨了 JSF 框架中使用的设计模式.详细讨论的设计模式包括 Singleton.Model-View-Controller.Factory Method.State.Composite.Decorator.Strategy.Template Method 和 O

关于网页设计制作中设计师的框架

近来,在Web开发中"框架"是一个相当时髦的词.比如JavaScript 框架 YUI. JQuery和Prototype 都引起广泛的关注, Web应用框架Rails and Dojo 更是引人瞩目,仿佛所有人都使用某种框架来开发自己的网站.但究竟什么是框架?是不是框架仅仅是对程序员有用,设计师是否可以从中收益? 什么是框架? 为了便于沟通,我们给"框架"统一一个定义(至少在本篇文章中是统一的):一套包含工具.函数库.约定,以及尝试从常用任务中抽象出可以复用的通用

C#中使用DirectX实现视频播放

很多人第一次接触到DirectX大都是通过游戏,至于安装.升级DirectX的原因 无非是满足游戏运行的需要.Direct X其实是微软公司推出的一个为Windows平台 的多媒体API函数库,它提供标准接口来与显卡和声卡.输入设备等进行交互.如 果没有这组标准API函数库,那你就需要为每一种显卡.声卡的每个组合和每种类 型的键盘.鼠标和游戏杆编写不同的代码.这不又回到了以前的Dos时代.为了解 决这个问题,微软公司推出了DirectX.DirectX从具体的硬件中抽象出来,并且 将一组通用指令

C#设计模式(4)——抽象工厂模式

原文:C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是本专