C++学习之继承篇(多继承与多重继承)
1.多继承
多继承是指一个子类继承多个父类。多继承对父类的个数没有限制,继承方式可以是公共继承、保护继承和私有继承,
不写继承方式,默认是private继承
多继承举例:
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
/**
* 定义工人类: Worker
* 数据成员: m_strName
* 成员函数: work()
*/
class Worker
{
public:
Worker(string name)
{
m_strName = name;
cout << "Worker" << endl;
}
virtual ~Worker()
{
cout << "~Worker" << endl;
}
void work()
{
cout << m_strName << endl;
cout << "work" << endl;
}
protected:
string m_strName;
};
/**
* 定义儿童类: Children
* 数据成员: m_iAge
* 成员函数: play()
*/
class Children
{
public:
Children(int age)
{
m_iAge = age;
cout << "Children" << endl;
}
~Children()
{
cout << "~Children" << endl;
}
void play()
{
cout << m_iAge << endl;
cout << "play" << endl;
}
protected:
int m_iAge;
};
/**
* 定义童工类: ChildLabourer
* 公有继承工人类和儿童类
*/
class ChildLabourer :public Worker,public Children
{
public:
ChildLabourer(string name, int age):Worker(name),Children(age)
{
cout << "ChildLabourer" << endl;
}
~ChildLabourer()
{
cout << "~ChildLabourer" << endl;
}
};
int main(void)
{
// 使用new关键字创建童工类对象
Worker * p = new ChildLabourer("jack",14);
// 通过童工对象调用父类的work()和play()方法
p->work();
// p->play();
// 释放
delete p;
p = NULL;
return 0;
}
输出结果:
Worker
Children
ChildLabourer
jack
work
~ChildLabourer
~Children
~Worker
由输出结果可以看出,在多继承中,任何父类的指针都可以指向子类的对象,在实例化子类时,先根据继承的顺序依次调用父类的构造函数,然后再调用该子类自己的构造函数;
用delete销毁该基类对象时,如果该基类的析构函数不是虚析构函数,且该基类的继承顺序在第一个,如上面的Worker类,(class ChildLabourer :public Worker,public Children)那么delete 父类的时候只会调用父类Worker的析构函数,系统不会出错,但是如果继承的时候顺序不是在第一位(class ChildLabourer :public Children,public Worker),就会报内存泄露的错误,如下图所示,如果父类的析构函数是虚析构函数,那么销毁的时候会先调用子类的析构函数再调用所有父类的析构函数,注意,此时,子类的父类的析构函数都会被调用!!!
2.多重继承
多重继承特点总结如下:
(1)多重继承与多继承不同,当B类从A类派生,C类从B类派生,此时称为多重继承
(1)当实例化子类时,会首先依次调用所有基类的构造函数,最后调用该子类的构造函数;销毁该子类时,则相反,先调用该子类的析构函数,再依次调用所有基类的析构函数。
(2)无论继承的层级有多少层,只要它们保持着直接或间接的继承关系,那么子类都可以与其直接父类或间接父类构成 is a的关系,并且能够通过父类的指针对直接子类或间接子类进行相应的操作,子类对象可以给直接父类或间接父类的对象或引用赋值或初始化。