您的位置:首页 > 编程语言 > C语言/C++

C++之继承(多重继承+多继承+虚继承+虚析构函数+重定义)

2017-03-04 13:07 260 查看
多重继承和多继承

这个我们来讲讲这两个的概念问题,一字之差,千差万别。

多重继承,比如有三个类,人类-士兵类-步兵类,三个依次继承,这样的继承称为多重继承。

class Person
{};

class Soldier :public Person
{};

class Infantryman :public Soldier
{};


多继承是如果一个类有多个基类,比如农民工类继承了农民类和工人类。

class Worker
{};

class Farmer
{};

class MigrantWorker:public Worker,public Farmer
{};


然而在实际过程中,会出现菱形继承的情况



如上图所示D继承了类B,C,类B,C都是A的派生类,既包含了多继承,又包含了多重继承,这就造成了我们在实例化D的时候,就会继承两个A的成员,造成数据的冗余,为了解决这种现象,我们引入了虚继承的方式,即如果B和C是虚继承A的话,那么实例化D以后,D中只有一份A的数据成员,不会冗余。

class Worker :virtual public Person// 虚基类
{};

class Farmer :virtual public Person
{};

class MigrantWorker:public Worker,public Farmer
{};


当我们在基类定义时机上virtual,如上面的代码所示,继承的农民工类实例化时,就只有一份person的数据了。

在继承中,派生类的对象可以复制给基类,也可以用基类的指针指向派生类的对象,反之不可以。但是基类还是无法访问子类中特有的成员函数和成员数据。如果销毁时,只调用了基类的析构函数,而没有调用派生类的,那么就会有一些内存没有删干净。为了防止这种现象,就会用到虚析构函数

当有继承关系时,用父类的指针指向堆中子类对象,并且想用父类的指针来释放掉这块内存,那么要用到虚析构函数,那么在释放内存时,会依次调用子类的析构函数和父类的析构函数。

class Person
{
public:
Person();//构造函数
virtual ~Person();//析构函数
void play();
private:
int m_iAge;
string m_strName;
};


重定义

重定义是指在当前的工程中,一个类被定义了两遍,只在多个继承类的.h文件中,多次引用了基类.h的文件,这就出现了重定义。可以通过宏定义解决重定义。

首先在公共继承的类中增加宏定义。在菱形继承中,宏定义必须会出现。

#ifndef PERSON_H
#define PERSON_H

/*******文件体************/

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 继承