C++中的多继承(附带实例)
除了单继承,即派生类只从一个基类继承公有和受保护的成员,C++ 中还允许派生类从多个基类继承公有和受保护的成员,这种继承方式称为多重继承。
例如,鸟能够在天空飞翔,鱼能够在水里游,而水鸟既能够在天空飞翔,又能够在水里游,那么在定义水鸟类时,可以将鸟和鱼同时作为其基类。
CBird 类和 CFish 类中都有一个 Breath() 函数,如果 CWaterBird 类对象调用 Breath(),就会出现编译错误,因为编译器不知道该调用哪个类的 Breath() 函数。
要解决该二义性问题也简单,在 Breath() 成员函数前使用域限定符清晰指定类名即可。例如:
【实例】多重继承谁先输出。本实例主要查看多重继承的构造顺序,具体代码如下:
C++多重继承的定义
多重继承中存在多个基类名标识符,其声明形式如下:
class 派生类名 : [继承方式1] 基类名1 , [继承方式n] 基类名n
{
[访问控制修饰符:]
[成员声明列表]
};
其中,由不同继承方式和基类名组成,用多个逗号分隔的列表称为派生表。例如,鸟能够在天空飞翔,鱼能够在水里游,而水鸟既能够在天空飞翔,又能够在水里游,那么在定义水鸟类时,可以将鸟和鱼同时作为其基类。
class CBird // 定义 CBird 类
{
public:
void FlyInSky() // 定义成员函数 FlyInSky
{
cout << "鸟能够在天空飞翔" << endl;
}
void Breath() // 定义成员函数 Breath
{
cout << "鸟能够呼吸" << endl;
}
};
class CFish // 定义 CFish 类
{
public:
void SwimInWater() // 定义成员函数 SwimInWater
{
cout << "鱼能够在水里游" << endl;
}
void Breath() // 定义成员函数 Breath
{
cout << "鱼能够呼吸" << endl;
}
};
class CWaterBird : public CBird, public CFish // 多重继承
{
public:
void Action()
{
cout << "水鸟既能飞又能游" << endl;
}
};
int main(int argc, char *argv[])
{
CWaterBird waterbird; // 定义 CWaterBird 类的对象
waterbird.FlyInSky(); // 调用 CBird 的 FlyInSky
waterbird.SwimInWater(); // 调用 CFish 的 SwimInWater
return 0;
}
程序的运行结果为:
鸟能够在天空飞翔
鱼能够在水里游
CBird 类和 CFish 类中都有一个 Breath() 函数,如果 CWaterBird 类对象调用 Breath(),就会出现编译错误,因为编译器不知道该调用哪个类的 Breath() 函数。
要解决该二义性问题也简单,在 Breath() 成员函数前使用域限定符清晰指定类名即可。例如:
waterbird.CFish::Breath(); // 调用 CFish 的 Breath waterbird.CBird::Breath(); // 调用 CBird 的 Breath
C++多重继承的构造顺序
单一继承方式中,先调用基类的构造函数,再调用派生类的构造函数。多重继承方式中,基类构造函数的调用顺序就是类声明中派生表给出的顺序。【实例】多重继承谁先输出。本实例主要查看多重继承的构造顺序,具体代码如下:
#include <iostream>
using namespace std;
class CBicycle // 定义 CBicycle
{
public:
CBicycle() // 默认构造函数
{
cout << "Bicycle Construct" << endl;
}
CBicycle(int iWeight) // 带参构造函数
{
m_iWeight = iWeight;
}
void Run()
{
cout << "Bicycle Run" << endl;
}
protected:
int m_iWeight;
};
class CAirplane // 定义 CAirplane
{
public:
CAirplane() // 构造函数
{
cout << "Airplane Construct" << endl;
}
CAirplane(int iWeight) // 带参构造函数
{
m_iWeight = iWeight;
}
void Fly()
{
cout << "Airplane Fly" << endl;
}
protected:
int m_iWeight;
};
class CAirBicycle : public CBicycle, public CAirplane // 多重继承
{
public:
CAirBicycle()
{
cout << "CAirBicycle Construct" << endl;
}
void RunFly()
{
cout << "Run and Fly" << endl;
}
};
int main()
{
CAirBicycle ab; // 定义 CAirBicycle 类对象 ab
ab.RunFly(); // 调用 RunFly()
return 0;
}
程序的运行结果为:
Bicycle Construct
Airplane Construct
CAirBicycle Construct
Run and Fly
ICP备案:
公安联网备案: