在多重继承的问题

到目前为止,所有的例子的继承我们已提出的单继承,继承的类,每个有且只有一个父。然而,C++提供了做多重继承的能力。多重继承的派生类可以从多个父类继承的成员。

我们想写一个程序来追踪一群教师。老师是一个人。然而,老师也是员工(如果为自己工作的他们自己的雇主)。多重继承可以用来创建一个老师的类继承属性都人与员工。使用多重继承,只需指定每个基类(就像在单一继承),用逗号分隔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <string>
class Person
{
private :
     std::string m_strName;
     int m_nAge;
     bool m_bIsMale;
 
public :
     Person(std::string strName, int nAge, bool bIsMale)
         : m_strName(strName), m_nAge(nAge), m_bIsMale(bIsMale)
     {
     }
 
     std::string GetName() { return m_strName; }
     int GetAge() { return m_nAge; }
     bool IsMale() { return m_bIsMale; }
};
 
class Employee
{
private :
     std::string m_strEmployer;
     double m_dWage;
 
public :
     Employee(std::string strEmployer, double dWage)
         : m_strEmployer(strEmployer), m_dWage(dWage)
     {
     }
 
     std::string GetEmployer() { return m_strEmployer; }
     double GetWage() { return m_dWage; }
};
 
// Teacher publicly inherits Person and Employee
class Teacher: public Person, public Employee
{
private :
      int m_nTeachesGrade;
 
public :
     Teacher(std::string strName, int nAge, bool bIsMale, std::string strEmployer, double dWage, int nTeachesGrade)
         : Person(strName, nAge, bIsMale), Employee(strEmployer, dWage), m_nTeachesGrade(nTeachesGrade)
     {
     }
};

在多重继承的问题

在多重继承,好像单继承的简单扩展,多重继承了很多问题,可明显提高了程序的复杂性,使他们一场噩梦。让我们来看看这些情况看。

首先,模糊,可当多个基类包含一个函数具有相同的名称。比如说呢。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class USBDevice
{
private :
     long m_lID;
 
public :
     USBDevice( long lID)
         : m_lID(lID)
     {
     }
 
     long GetID() { return m_lID; }
};
 
class NetworkDevice
{
private :
     long m_lID;
 
public :
     NetworkDevice( long lID)
         : m_lID(lID)
     {
     }
 
     long GetID() { return m_lID; }
};
 
class WirelessAdaptor: public USBDevice, public NetworkDevice
{
public :
     WirelessAdaptor( long lUSBID, long lNetworkID)
         : USBDevice(lUSBID), NetworkDevice(lNetworkID)
     {
     }
};
 
int main()
{
     WirelessAdaptor c54G(5442, 181742);
     cout << c54G.GetID(); // Which GetID() do we call?
 
     return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值