📅  最后修改于: 2020-09-25 05:00:59             🧑  作者: Mango
继承是面向对象编程语言的核心功能之一。它允许软件开发人员从现有的类派生一个新的类。派生类继承基类(现有类)的功能。
C++编程中有多种继承模型。
在C++编程中,不仅可以从基类派生一个类,还可以从派生类派生一个类。这种继承形式称为多级继承。
class A
{
... .. ...
};
class B: public A
{
... .. ...
};
class C: public B
{
... ... ...
};
在此,类别B
从基础类别A
派生,类别C
从派生类别B
派生。
#include
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
派生(类B
从基类A
派生)。
C
类的obj
对象在main()
函数定义。
调用display()
函数 , A
执行类A
display()
。这是因为在类C
和类B
没有display()
函数 。
编译器首先在类C
查找display()
函数 。由于该函数不存在,因此它将在类B
查找该函数 (因为C
是从B
派生的)。
该函数在类B
中也不存在,因此编译器在类A
查找它(因为B
是从A
派生A
)。
如果C
存在display()
函数 ,则编译器将覆盖类A
display()
(由于重写了成员 函数 )。
在C++编程中,一个类可以从多个父类派生。例如: Bat
类是从Mammal
和WingedAnimal
基类WingedAnimal
。这很有意义,因为蝙蝠既是哺乳动物又是有翅膀的动物。
#include
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
or
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 {
... .. ...
}