C++ FAQ Lite[19]--继承(基础)(更新)

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

[19] 继承 — 基础

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

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

FAQs in section [19]:

][19.1] 对于C++,继承是否重要?

][19.2] 何时该使用继承?

][19.3] 在C++中如何表达继承?

][19.4] 将一个派生类型的指针转换成它的基类型可以吗?

][19.5] public:, private:和 protected:有什么不同?

][19.6] 为什么派生类不能访问基类的private:成员?

][19.7] 如何才能在改变类的内在部分时,保护其派生类不被破坏?

[19.1] 对于C++,继承是否重要?

是。

继承是面向对象编程和抽象数据类型(ADT)编程的区分标志

[ Top | Bottom | Previous section | Next section ]

[19.2] 何时该使用继承?

作为一种特化的机制。

人们抽象事物有两种角度:“部分”和“种类”。Ford Taurus是一种(is-a-kind-of-a)汽车,并且 Ford Taurus 有(has-a)引擎,轮胎等。“部分”层次已经随着ADT风格而成为软件系统的一部分。继承则增加了另一种分解的角度。

[ Top | Bottom | Previous section | Next section ]

[19.3] 在C++中如何表达继承?

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

通过 :public 语法:

class Car : public Vehicle {

public:

// ...

};

我们有几种方式声明以上的关系:

Car 是 “一种”("a kind of a")Vehicle(交通工具)

Car 起源于("derived from")Vehicle

Car 是一种特殊化的("a specialized") Vehicle

Car 是Vehicle的一个子类("subclass")

Car 是Vehicle的一个派生类(“derived class”)

Vehicle 是Car的基类("base class")

Vehicle 是Car 的超类("superclass")(这在C++ 社群中不常用)

(注意: 本 FAQ 的论述仅与公有继承(public inheritance)有关; 私有和保护继承并不相同)

[ Top | Bottom | Previous section | Next section ]

[19.4] 将一个派生类型的指针转换成它的基类型可以吗?

可以。

派生类对象是基类对象的一种。因此从派生类指针到基类指针的转换是非常安全的,并且始终会发生。例如,如果有一个 car 类型的指针,而实际上指向了 vehicle,这种从 Car* 到 Vehicle* 的转换是非常安全的和常规的:

void f(Vehicle* v);

void g(Car* c) { f(c); } // 非常安全; 不用转换

(注意: 本 FAQ 的论述仅与公有继承(public inheritance)有关; 私有和保护继承并不相同)

[ Top | Bottom | Previous section | Next section ]

[19.5] public:, private:和 protected:有什么不同?

在类的private:节中声明的成员(无论数据成员或是成员函数)仅仅能被类的成员函数和友元访问。

在类的protected: 节中声明的成员(无论数据成员或是成员函数)仅仅能被类的成员函数,友元以及子类的成员函数和友元访问。

在类的public:节中声明的成员(无论数据成员或是成员函数)能被任何人访问。

[ Top | Bottom | Previous section | Next section ]

[19.6] 为什么派生类不能访问基类的private:成员?

为了使派生类在将来基类改变时不受影响。

派生类无法访问基类的私有成员。这样在对基类私有成员作任何改变时,就有效地锁定了派生类。

[ Top | Bottom | Previous section | Next section ]

[19.7] 如何才能在改变类的内在部分时,保护其派生类不被破坏?

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

类有两套截然不同的接口,它们分别面向两个截然不同的客户:

有为无关类服务的public: 接口

有为派生类服务的protected: 接口

除非你期望你的所有子类全部由你自己的团队建立,否则你应该考虑让基类部分成为private:,并且用 protected:来内联供子类访问基类私有数据的访问函数。使用这种方法,私有部分可以被改变,但是派生类的代码不会被破坏(除非你改变了protected的访问函数)。

[ 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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航