看了c#的教程,也上网络上搜索基类与派生类的概念,一直没有一个很明确的定义.弄得偶一直很迷糊,现在搜索到c++的教程里倒是有比较明确的说明,特意贴在这里,帮助自己理解.
继承机制提供了无限重复利用程序资源的一种途径。
继承使得我们得以用一种简单的方式来定义新类。如果我们定义了一个哺乳动物类,包括哺乳动物的一些普通属性和方法,然后再定义一个狗类, 有没有必要重头开始定义呢?
实际上这是没有必要的,因为狗是哺乳动物的一种特殊动物,定义狗类可以沿用哺乳动物类的所需的属性和方法,只需加上狗的颜色属性和狗尾巴会摇方法即可。
继承是C++语言的一种重要机制,它允许在已定义的类的基础上产生新类。
我们称从已定义类产生新类的过程称为派生。已存在的用来派生新类的类为基类,又称父类。由已存在的类派生出的新类称为派生类,又称为子类。如上例,从哺乳动物派生出狗,哺乳动物是父类,狗是子类。
在C++语言中, 一个派生类可以从一个基类派生,也可以从多个基类派生。
从一个基类派生的继承称为单继承(如动画6-1);
从多个基类派生的继承称为多继承(如动画6-2),
由两个基类一个风扇类和一个台灯类派生出一个风扇台灯类。
继承的处理从定义基类开始,基类定义了所有对于派生类来说普通的属性和方法,派生类从基类继承所需的属性和方法,且在派生类中增加新的属性和方法。
继承重用父类的代码,专注于为子类编写代码。
一.派生类的定义格式
1. 单继承的定义格式:
class <派生类名>:<继承方式><基类名>
{
<派生类新定义成员>
};
解释:
(1) <基类名>是已定义类的名称。 <派生类名>是新定义的一个类的名字,它是从<基类名>中派生的。
(2) 派生类按指定的<继承方式>从基类中派生的,<继承方式>有常用的如下三种:
public 表示公有继承
private 表示私有继承
protected 表示保护继承
2 多继承的定义格式
class<派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,......
{
<派生类新定义的成员>
}
多继承与单继承的主要区别从定义格式上看,主要是多继承的基类多于一个。
3 .例:单继承定义,
如已定义了基类:Mammal类,如何定义一个派生类:Dog类。
class Mammal{ //定义一个基类
protected:
int itsAge;
int itsWeight;
public: int GetAge(){return itsAge;}
void SetAge(int age){itsAge=age;}
int GetWeight(){return itsWeight;}
void SetWeight(int itsWeight;)
};
class Dog:public Mammal{ //定义一个派生类
private:
char itsColor[10];
public:
char GetColor{return itsColor;}
void SetColor(char *color){strcpy(itscolor,color);}
void WagTail(){cout << " 尾巴摇摇…/n";}
};
多继承定义,如已定义两个基类:Fan类和一个Lamp类,如何定义一个派生类:FanLamp类。
Class Fan{ //定义基类Fan
int flag,power;
public:
void on(){flag=1;cout <<"打开风扇/n";}
void off(){flag=0;cout <<"关闭风扇/n";}
};
class Lamp{ //定义基类Lamp
int flag,power;
public:
void on() {flag=1;cout <<"开灯/n";}
void off() {flag=0;cout <<"关灯/n";}
};
//定义派生类FanLamp
class FanLamp:public Fan,public Lamp
{
float price;
};
动画6_1
二. 派生类的三种继承方式 表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称为派生类或子类