C++的继承与派生

来源:互联网 发布:linux vi 删除多行 编辑:程序博客网 时间:2024/06/06 19:27
继承和派生是面向对象程序设计的两个重要的特性,继承是从已有的类那里得到已有的特性,已有的类为基类或父类,新类为派生类或子类。他们是从不同的角度说明类之间的关系,这种关系包含了访问机制、多态和重载等。

1、继承
解释:它是用已有的数据类型创建新的数据类型,并保留已有数据类型的特点。
(1)类的继承
继承方式有三种派生类:public private protect,访问控制修饰符也是这三种类型。”:“标识基类和派生类之间的继承关系。
格式:
class 派生类名标识符:[继承方式] 基类名标识符
{
[访问控制修饰符]
[成员声明列表]
}
例子:
class cemployee
{
public:
int id;
char m_name[20];
};
class coperator :public cemployee//定义一个操作员类,从cemployee类中派生而来
{
public:
char m_password[128];
bool login();
};//此时,操作员类里面就继承了cemployee的所有东西,同时又派生出来了operator的特性
2、继承后的可访问性
继承方式:public,private,protect
(1)public继承(共有型派生)
它原来是公有的或私有的,public派生类中仍然是过去的属性。对于私有型的还是只能在本类中使用,派生类是不能直接用的。
(2)private继承(私有型派生)和公有继承相似
(3)protect继承(保护型派生)在派生后,基类的属性都变成了保护类,且保护类的内部数据不能随意更改。
3、构造函数访问顺序
先调用父类的构造函数,再调用子类的。而析构时,先析构子类的,后析构父类的。
4、子类隐藏父类的成员函数
如果子类中定义了和父类相同的成员函数,在引用时,用子类定义的对象直接引用的是子类的函数,它将父类那个给隐藏了。访问不到。
如果就想用子类定义的对象访问父类中的成员函数,则只能是——对象.父类::函数()这样引用。
如果重定义了函数,则同样要指明它的父类名称。
如果用父类定义了一个指针,在引用时,直接就是指针指向的那个函数了。
5、重载运算符
在普通的类型中的加减等运算是可以直接进行的,但是在构造的新类中,想用加减法等,电脑是不认识的,只能再重新定义加减法的功能,因此需要重载运算符。
声明格式:
opertator 类型名();(具体内容省略)
6、转换运算符
如:int i=10;
double d;
d=(double)i;
程序中将整型数i强制转换成了double型。
格式:
operator double(){}
7、多重继承
解释:子类从多个父类继承受保护的成员。
格式:
class 派生类名标识符 [继承方式] 基类1,[继承方式] 基类2{};
在多重继承中会遇到一个问题,就是如果父类1和父类2有重名的成员函数,子类创建对象想调用父类的这个成员函数时,会用哪个父类的?这就需要解决二义性的问题。
8、二义性的解决方案——多重继承的构造顺序
多重继承中的基类构造函数被调用的顺序与类派生表中声明的顺序为准。这个表就是按照基类名标识符的前后顺序进行的。
9、多态
解释:多态性是指具有不同功能的函数用同一个名字。它通过联编实现,联编是指一个计算机程序员自身彼此关联的过程。联编可以分为两种:静态联编和动态联编。且根据联编的时刻不同,存在两种类型多态性,即函数重载和虚函数。
10.虚函数
解释:虚函数就是能实时实现动态绑定的函数,它的方法是,定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象,通过该指针调用这个函数。如果没有虚函数的话,它定义的基类指针调用时永远是调用的基类里的方法,而不是派生类的。在基类使用虚函数后,它的派生类的这个同名函数同样也成为了虚函数。但是,这时,只要写明调用的是谁,就可以跳到哪里去。
11、纯虚函数
解释:包含有纯虚函数的类成为抽象类,一个抽象类至少有一个纯虚函数。纯虚函数是指被标明为不具体实现的虚成员函数。它不能被直接调用,仅仅起到提供一个与派生类相一致的接口作用。
格式:
virtual 类型 函数名(参数列表)=0;

0 0