C++——多重继承 – 作者:Johnson666

多重继承派生类的构造函数

多重继承派生类的构造函数形式与单继承时的构造函数形式基本相同,只是在初始化表中包含多个基类构造函数,各基类的排列顺序任意。
多重继承派生类的构造函数执行顺序为:先调用基类的构造函数,再执行派生类构造函数。调用基类构造函数的顺序是声明派生类时基类出现的顺序。

多重继承的应用:

#include <iostream>
using namespace std;
class BaseA{//基类A
public:
    BaseA(int a): base_a(a)
	{
	    cout<<"BaseA constructor"<<endl;
	}
    ~BaseA()
	{
	    cout<<"BaseA destructor"<<endl;
	}
protected:
int base_a;
};
class BaseB{//基类B
public:
	BaseB(int b): base_b(b)
	{
	    cout<<"BaseB constructor"<<endl;
	}
    ~BaseB()
	{
	    cout<<"BaseB destructor"<<endl;
	}
protected:
int base_b; 
};
class DerivedC: public BaseA, public BaseB{//派生类C
public:
	DerivedC(int a, int b, int c): BaseA(a), BaseB(b), derived_c(c)
	{
cout<<"Derived constructor"<<endl;
	}
    ~DerivedC()
	{
        cout<<"Derived destructor"<<endl;
    }
   void show()
   {
        cout<<base_a<<", "<<base_b<<", "<<derived_c<<endl;
   }
private:
int derived_c;
};
int main()
{
    DerivedC c(1, 2, 3);
    c.show();
    return 0;
}

结果:
image.png
本例中先声明基类BaseA和BaseB,然后以公有继承方式共同派生出类DerivedC,因此BaseA和BaseB都可以看成DerivedC的直接基类。在派生类的构造函数中可以看到,对于派生类中继承的基类成员变量,通过调用基类的构造函数实现初始化。另外从运行结果中还可以发现,多重继承形式下析构函数的执行顺序和构造函数的执行顺序相反。

多重继承引起的二义性问题

多重继承可以反映现实生活中的情况,能够有效地处理一些较复杂的问题,使编写程序具有灵活性。但是多重继承增加了程序的复杂度,使程序的编写和维护变得相对困难,程序容易出错。其中最常见的问题就是继承的成员同名而产生的二义性问题。
1.两个基类有同名成员。
2.两个基类和一个派生类三者都有同名成员。
3.基类A和基类B从同一基类派生。
会有这三种情况。

多重继承构造函数的应用:

#include<iostream>

using namespace std;

class BaseN
{
public:
	BaseN(int n)
	{
		baseN = n;
	}
	void Show()
	{
		cout << "baseN:" << baseN << endl;
	}
	int baseN;
};

class BaseA: public BaseN
{
public:
	BaseA(int n): BaseN(n){}
};

class BaseB: public BaseN
{
public:
	BaseB(int n): BaseN(n){}
};

class DerivedC: public BaseA, public BaseB
{
public:
	DerivedC(int n1, int n2, int c): BaseA(n1), BaseB(n2)
	{
		derived_c = c;
	}
	void Show()
	{
		cout << "derived_c:" << derived_c << endl;
	}
	int derived_c;
};

int main()
{
	DerivedC c(1000, 100 , 10);
	c.BaseA::Show();
	c.BaseB::Show();
	c.Show();
	return 0;
}

结果:
image.png
类BaseA和类BaseB分别从类BaseN那里继承了成员变量baseN和成员函数Show(),这样在类BaseA和类BaseB中同样存在同名的成员变量baseN和成员函数Show()。但是在派生类DerivedC中,类BaseA和类BaseB的同名成员变量baseN有着不同的存储单元,可以分别存放不同的数据。在程序中可以通过类BaseA和类BaseB的构造函数去调用基类BaseN的构造函数,分别对类BaseA和类BaseB的成员变量baseN进行初始化。
在派生类DerivedC中,要想访问BaseA和BaseB的同名成员变量baseN的数据,可以通过在派生类对象名后增加直接基类名的形式访问,如c.BaseA::Show()。

来源:freebuf.com 2021-06-18 14:05:04 by: Johnson666

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论