分享
 
 
 

C++ FAQ Lite[22]--继承(抽象基类)(更新)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

[22] 继承 — 抽象基类(ABCs)

(Part of C++ FAQ Lite, ]Copyright © 1991-2001, Marshall Cline, cline@parashift.com)

简体中文版翻译:申旻nicrosoft@sunistudio.com东日制作室东日文档

FAQs in section [22]:

][22.1] 将接口和实现分离的作用是什么?

][22.2] 在C++中如何分离接口和实现(就象 Modula-2)?

][22.3] 什么是 ABC?

][22.4] 什么是“纯虚”成员函数?

][22.5] 如何为包含指向(抽象)基类的指针的类定义拷贝构造函数或赋值操作符?

[22.1] 将接口和实现分离的作用是什么?

接口是公司最有价值的资源。设计接口比用一堆类来实现这个接口更费时间。而且接口需要更昂贵的人力的时间。

既然接口如此有价值,它们应该被保护,以免因为数据结构和其他实现的改变而被破坏。因此,应该将接口和实现分离。

[ Top | Bottom | Previous section | Next section ]

[22.2] 在C++中如何分离接口和实现(就象 Modula-2)?

使用]ABC。(译注:即抽象基类 abstract base class)

[ Top | Bottom | Previous section | Next section ]

[22.3] 什么是 ABC?

[Recently renamed "subclass" to "derived class" (on 7/00). ]Click here to go to the next FAQ in the "chain" of recent changes.]

抽象基类(abstract base class)。

在设计层次,抽象基类(ABC)对应于抽象概念。如果你问一个机修工他是否修理交通工具,他可能想知道你所说的是哪种交通工具。他不修理航天飞机、远洋轮、自行车或核潜艇。问题在于“交通工具”是一个抽象概念(例如,除非你知道你要建造哪种交通工具,否则你无法建造一个“交通工具”)。在C++中,Vehicle(交通工具)类是一个ABC,而Bicycle(自行车),SpaceShuttle(航天飞机)等则是派生类(OceanLiner(远洋轮)是一种Vehicle)。在真实世界的OO中,ABC无处不在。

在程序语言层次上,抽象基类(ABC)是有一个或多个]纯虚成员函数的类。无法建立抽象基类的对象(实例)。

[ Top | Bottom | Previous section | Next section ]

[22.4] 什么是“纯虚”成员函数?

[Recently renamed "subclass" to "derived class" (on 7/00). ]Click here to go to the next FAQ in the "chain" of recent changes.]

将普通类变成抽象基类(也就是ABC)的成员函数。通常只在派生类中实现它。

某些成员函数只在概念中存在,而没有合理的定义。例如,假设我让你在坐标(x,y)处画一个图形,大小为 7。你会问我:“我应该画哪种图形?”(圆,矩形,六边形等,画法都不同)。在C++中,我们必须指出 draw() 成员函数的实在物(由此用户才能在有一个Shape*或者 Shape& 的时候调用它),但我们认识到,在逻辑上,它只能在子类中被定义:

class Shape {

public:

virtual void draw() const = 0; // = 0 表示它是 "纯虚" 的

// ...

};

这个纯虚函数使 Shape 成为了ABC(抽象基类)。如果你愿意,你可以将“= 0;”语法看作为代码位于NULL指针处。因此 Shape 向它的用户承诺了一个服务,然而 Shape 无法提供任何代码来实现这个承诺。这样做使得即使基类没有足够的信息来实际定义成员函数时,也强制了任何由 Shape 派生的具体类的对象须给出成员函数。

注意,为纯虚函数提供一个实现是可能的,但是这样通常会使初学者糊涂,并且最好避免这样,直到熟练之后。

[ Top | Bottom | Previous section | Next section ]

[22.5] 如何为包含指向(抽象)基类的指针的类定义拷贝构造函数或赋值操作符?

如果类拥有被(抽象)基类指针指向的对象,则在(抽象)基类中使用]虚构造函数用法。就如同一般用法一样,在基类中声明一个]纯虚方法 clone() :

class Shape {

public:

// ...

virtual Shape* clone() const = 0; // ]虚拟(拷贝)构造函数

// ...

};

然后在每个派生类中实现 clone()方法:

class Circle : public Shape {

public:

// ...

virtual Shape* clone() const { return new Circle(*this); }

// ...

};

class Square : public Shape {

public:

// ...

virtual Shape* clone() const { return new Square(*this); }

// ...

};

现在假设每个 Fred 对象有一个 Shape对象。Fred对象自然不知道 Shape是圆还是矩形还是……。Fred的拷贝构造函数和赋值操作符将调用Shape的clone()方法来拷贝对象:

class Fred {

public:

Fred(Shape* p) : p_(p) { assert(p != NULL); } // p must not be NULL

~Fred() { delete p_; }

Fred(const Fred& f) : p_(f.p_->clone()) { }

Fred& operator= (const Fred& f)

{

if (this != &f) { // 检查自赋值

Shape* p2 = f.p_->clone(); // Create the new one FIRST...

delete p_; // ...THEN delete the old one

p_ = p2;

}

return *this;

}

// ...

private:

Shape* p_;

};

[ Top | Bottom | Previous section | Next section ]

E-mail the author

[ C++ FAQ Lite | Table of contents | Subject index | ]About the author | | ]Download your own copy ]

Revised Apr 8, 2001

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有