原文: https://www.programiz.com/cpp-programming/multilevel-multiple-inheritance
继承是面向对象编程语言的核心功能之一。 它允许软件开发人员从现有的类派生一个新的类。 派生类继承基类(现有类)的功能。
C++ 编程中有多种继承模型。
在 C++ 编程中,不仅可以从基类派生一个类,还可以从派生类派生一个类。 这种继承形式称为多级继承。
class A
{
... .. ...
};
class B: public A
{
... .. ...
};
class C: public B
{
... ... ...
};
这里,类别B
从基础类别A
派生,类别C
从派生类别B
派生。
#include <iostream>
using namespace std;
class A
{
public:
void display()
{
cout<<"Base class content.";
}
};
class B : public A
{
};
class C : public B
{
};
int main()
{
C obj;
obj.display();
return 0;
}
输出
Base class content.
在此程序中,类别C
源自类别B
(源自基础类别A
)。
在main()
函数中定义了C
类的obj
对象。
当调用display()
函数时,将执行A
中的display()
。 这是因为在C
类和B
类中没有display()
函数。
编译器首先在类C
中寻找display()
函数。 由于该函数不存在,因此将在B
类中查找该函数(因为C
源自B
)。
该函数在B
类中也不存在,因此编译器在A
类中查找它(因为B
是从A
派生的)。
如果C
中存在display()
函数,则编译器将覆盖类A
的display()
(因为成员函数将覆盖)。
在 C++ 编程中,一个类可以从多个父类派生。 例如:类Bat
源自基类Mammal
和WingedAnimal
。 这很有意义,因为蝙蝠既是哺乳动物又是有翅膀的动物。
#include <iostream>
using namespace std;
class Mammal {
public:
Mammal()
{
cout << "Mammals can give direct birth." << endl;
}
};
class WingedAnimal {
public:
WingedAnimal()
{
cout << "Winged animal can flap." << endl;
}
};
class Bat: public Mammal, public WingedAnimal {
};
int main()
{
Bat b1;
return 0;
}
输出
Mammals can give direct birth.
Winged animal can flap.
多重继承最明显的问题发生在函数覆盖期间。
假设两个基类具有相同的函数,但在派生类中未覆盖该函数。
如果尝试使用派生类的对象调用该函数,则编译器将显示错误。 这是因为编译器不知道要调用哪个函数。 例如,
class base1
{
public:
void someFunction( )
{ .... ... .... }
};
class base2
{
void someFunction( )
{ .... ... .... }
};
class derived : public base1, public base2
{
};
int main()
{
derived obj;
obj.someFunction() // Error!
}
可以通过使用范围解析函数指定将base1
或base2
分类的函数来解决此问题。
int main()
{
obj.base1::someFunction( ); // Function of base1 class is called
obj.base2::someFunction(); // Function of base2 class is called.
}
如果从基类继承多个类,则称为分层继承。 在分层继承中,子类中共有的所有函数都包括在基类中。
例如:物理,化学,生物学均来自科学类。
class base_class {
... .. ...
}
class first_derived_class: public base_class {
... .. ...
}
class second_derived_class: public base_class {
... .. ...
}
class third_derived_class: public base_class {
... .. ...
}