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

来源:互联网 发布:季度数据季节调整 编辑:程序博客网 时间:2024/05/16 09:13

多重继承和多继承
这个我们来讲讲这两个的概念问题,一字之差,千差万别。
多重继承,比如有三个类,人类-士兵类-步兵类,三个依次继承,这样的继承称为多重继承。

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
1 0