即使看c#的教程,在网上检索基类和派生类的概念也没有明确的定义。 虽然很混乱,但是搜索现在的C教程,有比较明确的说明,所以特意贴在这里,帮助自己理解。
继承机制提供了无限重用程序资源的方法。
通过继承,我们可以用简单的方法定义新类。 如果定义了包含哺乳动物一般属性和方法的哺乳动物类,并定义了狗类,是否需要重新定义?
实际上没有必要。 由于狗是哺乳动物的特殊动物,定义犬类可以继承哺乳动物的必要属性和方法,只需加入犬的颜色属性和犬尾巴摆动的方法。
继承是C语言的重要机制,可以基于定义的类生成新类。
从预定义的类生成新类的过程称为派生。 用于派生现有新类的类是基类,也称为父类。 从现有类派生的新类称为派生类,也称为子类。 如上例所示,哺乳类派生出狗,哺乳类为父代,狗为子代。
在c语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。
从基类派生的继承称为单继承(例如动画6-1 );
从多个基类派生的继承称为多继承,如动画6-2所示,
两个基类从一个风扇类和一个支架类派生一个风扇类。
的处理从定义基类开始,基类定义派生类的所有常见属性和方法,派生类从基类继承所需的属性和方法,并向派生类添加新的属性和方法。
继承重用父类的代码,集中精力编写子类的代码。
一.派生类的定义格式
1 .单继承的定义格式:
class派生类名称:继承方式基类名称
{
派生类新定义成员
(;
说明:
(1)基类名称是定义的类名。 派生类名称是新定义的类名,从基类名称派生。
)2)派生类按照指定的继承方式从基类派生,继承方式经常使用以下三种:
公共表示公有继承
private表示私人继承
protected表示保护继承
2多个继承的定义格式
class派生类名称:继承方式1基类名称1、继承方式2基类名称2、……。
{
派生类中新定义的成员
}
多继承与单继承的主要区别在于,从定义形式来看,主要是多继承的基类有多个。
3 .示例:单继承定义
基类:如果定义了Mammal类,如何定义派生类: Dog类?
class Mammal{ //定义基类
保护:
int itsAge;
int itsWeight;
公共: int get age () {return itsAge; }
voidsetage(intage ) {itsAge=age; }
int GetWeight () {返回its weight; }
voidsetweight(intitsweight; )
(;
定义class dog :公共邮件{//派生类
私有:
char itsColor[10];
公共:
char GetColor{return itsColor; }
voidsetcolor(char*color ) strcpy (its color,color ); }
void WagTail () {cout摇摇尾巴…/n ); }
(;
如果定义了Fan类和Lamp类这两个基类,则继承多个定义,包括如何定义派生类FanLamp类。
Class Fan{ //定义基类Fan
int flag,power;
公共:
void on () ) {flag=1; cout '粉丝/n '; }
void off () ) {flag=0; 关闭cout '风扇/n '; }
(;
定义类Lamp {//基类lamp
int flag,power;
公共:
void on () ) {flag=1; cout '点亮/n '; }
void off () ) {flag=0; cout '熄灭/n '; }
(;
//定义派生类FanLamp
class FanLamp:public Fan,public Lamp
{
浮动价格;
(;
动画6_1
2 .派生类之三
种继承方式 表6-1表示三种继承方式的各自特点。
公有继承、私有继承和保护继承是常用的三种继承法方式
1. 对于公有继承方式 基类成员对其对象的可见性公有成员可见,其他成员不可见基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员可见基类成员对派生类对象的可见性对派生类对象来说,基类的公有成员是可见的,其他成员是不可见2.对于私有继承方式基类成员对其对象的可见性公有成员可见,其他成员不可见基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员是可见的基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的
第一种继承方式程序段如下:
定义基类A: class A { int x; protected: int y; public: A(); ~A(); friend void cal(); void display(); }; 定义继承类B: class B:public A { int z; public: B(); void fun(); };定义继承类C:
class c:private B{ int t; public: c(); ~c(); };
三.基类和派生类关系
任何一个类都有可以派生出上个新类,派生类也可以再派生出新类,因此,基类和派生类是相对而言的。一个基类可以是另一个基类的派生类,这样便形成了复杂的继承结构,出现了类的层次。一个基类派生出一个派生类,它又做另一个派生类的基类,则原来基类为该派生类的间接基类。
基类与派生类之间的关系可以有如下几种描述:
1 派生类是基类的具体化
类的层次通常反映了客观世界中某种真实的模型。例如,定义输入设备为基类,而键盘、鼠标器和数字化板将是派生类,它们关系如图6-3所示,在这种情况下,不难看出:基类是对若于个派生类的抽象,而派生类是基类的具体化。基类抽取了它的派生类的公共牲,而派生类通过增加行为将抽象类变为某种有用的类型。
2 派生类是基类定义的延续
先定义一个抽象基类,该基类中有些操作并未实现。然后定义非抽象的派生类,实现抽象基类中定义的操作。例如,虚函数就属此类情况。这时,派生类是抽象的基类的实现,即可看成是基类定义的延续。这也是派生类的一种常用的方法。
3 派生类是基类的组合
在多继承时,一个派生类有多于一个的基类,这时派生类将是所有基类行为的组合。如上述派生类风扇台灯类就是基类风扇类和台灯类的组合。
例题6-1
下面定义了一个关于交通工具的类
class vehicle
{
int wheels; //轮子数
float weight; //重量
public:
void initialize(int in_wheels, float in_weight);
int get_wheels( ) {return wheels;}
float get_weight( ) {return weight;}
float wheel_loading( ) {return weight/wheels;}
};
如果要再定义一个小轿车的类和一个卡车的类,如何实现呢?这里我们就要用到面向对象程序设计的另一个机制--继承。现实世界的物质多种多样,但许多物质都存在着层次关系,这种层次结构是我们找到了描述事物的解决方法。
下面通过继承来派生出小汽车和卡车的类。
//小汽车的类
class car : public vehicle
{
int passenger_load; //载客数
public:
void initialize(int in_wheels, float in_weight, int people = 4);
int passengers( ) {return passenger_load;}
};
//卡车的类
class truck : public vehicle
{
int passenger_load; //载客数
float payload; //有效负载
public:
void init_truck(int how_many = 2, float max_load = 24000.0);
float efficiency( ); //马力
int passengers( ) {return passenger_load;}
};
说明:上面通过继承从类vehicle中派生出了car和truck两个类。我们把vehicle称为基类,把car和truck称为派生类或子类