单继承和菱形继承

来源:互联网 发布:朴宰范 私生活问题知乎 编辑:程序博客网 时间:2024/06/05 07:09

一、继承的概念

   通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。

二、主要的继承方式:

<继承方式>常使用如下三种关键字给予表示:
public:公有继承基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。
private:私有继承基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
protected:保护继承基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。
默认继承:struct类型的默认继承是公有形式,class的默认继承是私有形式继承。

三、主要分为以下四种

(1)单继承:从一个基类继承的称为单继承

   定义格式:

class<派生类名>:<继承方式><基类名>
{
<派生类新定义成员>
};

其中,class是关键词,<派生类名>是新定义的一个类的名字,它是从<基类名>中派生的,并且按指定的<继承方式>派生的。

#include<iostream>using namespace std;class bace{public:bace(){cout << "bace()" << endl;}private:int _b;};class Drive :public bace{public:Drive(){cout << "Drive()" << endl;}private:int _d;};

(2)多继承:继承多个基类的继承称为多继承

定义格式:
class<派生类名>:<继承方式><基类名>,<继承方式><基类名>
{
<派生类新定义成员>
};

(3)菱形继承:由单继承和多继承共同构成,即就是两个子类继承同一个父类,而又有子类同时继承这两个子类。

其结构如图所示

class A{public:A(){cout << "A()" << endl;}public:int _a;};class B1 :public A{public:B1(){cout << "B1()" << endl;}public:int _b1;};class B2 :public A{public:B2(){}int _b2;};class D :public B1, public B2{public:D(){}int _d;};int main(){D d;d.B1::_a = 1;d.B2::_a = 0;d._b1 = 2;d._b2 = 3;d._d = 4;}

接下来对菱形继承做一分析,如下图所示:

(4)虚继承:

菱形继承会出现数据成员冗余现象,因此菱形继承一般和虚拟继承相结合使用。这一点会在接下来会做详细介绍。
虚继承有效的解决了成员变量冗余的情况,解决多重继承中派生类成员函数调用模糊问题。比如类A中有一个函数print(),类B继承A,类C继承A,类D继承类B和类C,这个时候,类D中就有两个print函数,一个是从B继承得到的,一个是从C继承得到的,则类D的对象调用print函数就会出现print模糊的编译错误。解决办法:类B虚拟继承A。类C虚拟继承A,类D继承BC时,只拷贝A中的数据成员和函数成员一次,再遇到拷贝时候就忽略了!

 虚继承就是为了节约内存的,他是多重继承中的特有的概念。适用于菱形继承形式。

原创粉丝点击