一、认识继承

什么是继承呢,就是一个对象有另一个对象的所有特征,并且在这些特征上还有新的属于自己的特征,则一个对象就是另一个对象的继承。比如儿子继承父亲的相貌之外还有自己的相貌特征。在C++中,继承是面向对象复用的重要手段。通过继承定义一个类,它们的类型之间的关系建模,共享公有的东西,实现各自本质不同的东西。

二、继承的作用

打个比方,你描述了狗这个对象,对于黑狗,只需描述狗是黑的这一特征,并不需要再去把狗描述一遍。因为黑狗继承了狗的所有特征,并且拥有自己是“黑”的这一特征。对于这样的继承,我们可以利用过去的类建立新的类,节省编程工作量,减少冗余代码。

三、继承关系

我们都知道,在类中,有public,private,protected三种成员访问限定符,对于继承来的子类,它的成员又有怎样的访问限定呢?我们通过一个表来说明一下。


同时,我们通过实例来看一下他们之间的相互继承关系

classBase

{

public:

Base()

{

cout<<"B()"<<endl;

}


~Base()

{

cout<<"~B()"<<endl;

}


voidShowBase()

{

cout<<"_pri = "<<_pri<<endl;

cout<<"_pro = "<<_pro<<endl;

cout<<"_pub = "<<_pub<<endl;

}


private:

int_pri;

protected:

int_pro;

public:

int_pub;

};


classDerived:publicBase

{

public:

Derived()

{

cout<<"D()"<<endl;

}


~Derived()

{

cout<<"~D()"<<endl;

}


voidShowDerived()

{

cout<<"_pri = "<<_pri<<endl;

cout<<"_pro = "<<_pro<<endl;

cout<<"_pub = "<<_pub<<endl;


cout<<"_d_pri = "<<_d_pri<<endl;

cout<<"_d_pro = "<<_d_pro<<endl;

cout<<"_d_pub = "<<_d_pub<<endl;

}


private:

int_d_pri;

protected:

int_d_pro;

public:

int_d_pub;

};

对于代码中的绿色的一行,显然是不能够被编译通过的,因为他在父类中的成员数据是private的,父类的私有成员在派生类中是不能被访问的。

四、派生类的默认成员函数

派生类也是类,也拥有类的默认成员函数,构造函数,拷贝构造函数,析构函数,赋值运算符重载,取地址符重载,const修饰的取地址操作符重载。

在类中,构造函数有着调用顺序,对于继承关系中的构造函数调用顺序又将是是怎样的呢?我们来看一下。

同时析构函数的调用顺序如下图

我们在通过代码实例来看一下构造,析构函数得调用顺序

class B

{

public:

int data1;

};


class B1: virtual public B

{

public:

int data2;

};


class B2: virtual public B

{

public:

int data3;

};


class D:public B1, public B2

{

public:

void FunTest()

{

B1::data1 = 0x01;

data2 = 0x02;

B2::data1 = 0x03;

data3 = 0x04;

data4 = 0x05;

cout<<this<<endl;

cout<<&B1::data1<<endl;

cout<<&data2<<endl;

cout<<&B2::data1<<endl;

cout<<&data3<<endl;

cout<<&data4<<endl;

cout<<data1<<endl;

}

int data4;

};


int main()

{

cout<<sizeof(B)<<endl;

cout<<sizeof(B1)<<endl;

cout<<sizeof(B2)<<endl;

cout<<sizeof(D)<<endl;

D d;

d.FunTest();

return 0;

}

五、单继承与多继承

单继承--一个子类只有一个直接父类时称这个继承关系为单继承

多继承--一个子类有两个或以上直接父类时称这个继承关系为多继承