基类派生类

看了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称为派生类或子类

时间: 2024-12-19 15:51:57

基类派生类的相关文章

Python源码 -- C语言实现面向对象编程(基类&amp;派生类&amp;多态)

由于公司的ERP系统数据量大,有40G+的数据,并发用户90+,连接数1000+,原来的IO性能跟不上用户的操作响应需求,报表查询慢,该做的索引都做过了,索引每周重建一次,还是解决不了问题,为此,公司新购了dell poweredge R720xd服务器,该套服务器支持2个阵列,24个硬盘,双CPU,64G内存,比较牛X的了,我们创建两个raid,两块SAS硬盘做Raid1,6块SSD硬盘做Raid10,系统装好了,高兴呀,但结过测试发现,总有一个raid速度相当慢,和台式机速度一样,我地妈呀,

c++ 友元类 与 友元类派生类

定义: 当一个类B成为了另外一个类A的"朋友"时,那么类A的私有和保护的数据成员就可以被类B访问.我们就把类B叫做类A的友元. 用法: 在A类中加入: friend class B; 下面这个程序说明了友元类与友元派生类的权限. class A { public: friend class FriendA; private: int a; }; class FriendA { public: void print(A& ca) { //因为是友元类,所以可以访问A类的私有成员.

C++:基类和派生类

4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public: void print() { cout<<"name:"<<name<<endl; cout<<"age:"<<age<<endl; cout<<"sex:"<<sex<<endl; } protected: string name;

C++基类和派生类的构造函数和析构函数的调用

C++基类和派生类的构造函数和析构函数的调用 1.调用顺序 当创建一个派生类的对象时,系统首先自动创建一个基类对象,也就是说,在调用派生类构造函数创建派生类对象之前,系统首先调用基类的构造函数创建基类对象.当派生类对象生命期结束时,首先调用派生类的析构函数,然后调用基类的析构函数. 所以,构造函数:基类->派生类:析构函数:派生类->基类. 示例: 1 #include<iostream> 2 using namespace std; 3 4 class A 5 { 6 publi

OOP1(定义基类和派生类)

面向对象程序设计基于三个基本概念:数据抽象,继承和动态绑定 数据抽象是一种依赖于接口和实现分离的编程技术.继承和动态绑定对程序的编号有两方面的影响:一是我们可以更容易地定义与其它类相似但不完全相同的类:二是在使用这些彼此相似的类编写程序时,我们可以在一定程度上忽略掉它们的区别. 在 c++ 语言中,当我们使用基类的引用或指针调用一个虚函数时将发生动态绑定 定义基类: 1 class Quote { 2 public: 3 Quote() = default; 4 Quote(const std:

派生类

一.派生类 派生类有基类所有的成员函数,成员变量 二.格式 class 派生类名 : public 基类名 { ............. }; 原文地址:https://www.cnblogs.com/shenyuling/p/10017586.html

从设计基类及其派生类看继承关系

继承能够定义可重用.扩展或修改父类行为的子类.但基类的静态构造函数.实例构造函数和析构函数不能被派生类继承. 在下面实例中,定义一个基类Publication用于表示任何类型的出版物以及派生至Publication的其他类型Book类,由此也可以扩展为定义其他类型如:Magazine.Journal.Newspaper和Article. 在设计基类Publication时我们必须考虑到如下关系: 1.要在基类中添加哪些成员 2.基类是否用作派生类模板的抽象基类 3.类层次结构的扩展空间大小,要开

派生类和基类的转换

指针引用分四种情况: 1.直接用基类指针引用基类对象 2.直接用派生指针引用派生对象 3.由基类指针引用派生类对象,由于派生类也是基类对象(包含关系),所以这种引用是安全的.但是只能引用基类成员,若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错误.(解决该问题的答案是虚函数和多态性) 4.用派生类指针引用基类对象,这种方式会导致编译器报错.必须先把派生类指针强制转换成基类指针. 如果基类和派生类都定义了同名函数,通过对象指针调用成员函数时,到底调用哪里的函数由指针的原始类型决

C#派生类中使用基类protected成员的方法

我们知道C#中通过继承可以使一个具有公共数据和方法的基类被广泛应用从而减少代码量,这样派生类会具有基类中所有成员(除构造器等),我们理所当然可以通过派生类实例来使用基类的成员.那么当基类成员被protected修饰时,我们应该怎么在派生类中使用基类成员呢,下面将介绍使用方法. 首先我们贴一段错误的使用代码: 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Console.ReadLine(); 6 7 } 8 } 9 pub