继承是一个重用和扩展现有类而无需修改该类的机制,从而在两者之间形成层级关系。
继承差不多是吧一个对象嵌入到另外一个对象。假设你在类 B 的定义中声明类 A 的一个对象 x 对象,结果,类 B 将能够访
问类 A 所有的公共的数据成员以及成员函数。然而,在类 B 中,你想要访问类 A 的所有的公共数据成员以及成员函数,需
要通过类 A 的对象 x。 下面的例子示例这些:
1 #include <iostream>
2 using namespace std;
3
4 class A {
5 int data;
6 public:
7 void f(int arg) { data = arg; }
8 int g() { return data; }
9 };
10
11 class B {
12 public:
13 A x;
14 };
15
16 int main() {
17 B obj;
18 obj.x.f(20);
19 cout << obj.x.g() << endl;
20 // cout << obj.g() << endl;
21 }
在主函数中,对象 obj 利用语句 obj.x,f(20) 通过它的数据成员 B::x 访问函数 A::f()。 对象 obj 利用语句 obj.x.g()
以类似的方式访问 A::g()。 由于 g() 是类 A 的成员函数,而不是类 B 的成员函数,编译器将不允许语句 obj.g() 通过。
继承机制允许你使用相似于上面例子中的语句 obj.g() 。为了让该语句合法, g() 必须是类 B 的成员函数。
继承允许你将另外一个类成员的名称以及定义作为新类的一部分。某个类,你想将其成员包含到你的新类,这个类称为基类。
下面的例子和上面的例子一样,除了它用了继承机制,允许类 B 访问类 A 的成员。
1 #include <iostream>
2 using namespace std;
3
4 class A {
5 int data;
6 public:
7 void f(int arg) { data = arg; }
8 int g() { return data; }
9 };
10
11 class B : public A { };
12
13 int main() {
14 B obj;
15 obj.f(20);
16 cout << obj.g() << endl;
17 }
类 A 是类 B 的基类。 类 A 成员变量的名称和定义都包含在类 B 的定义中。类 B 继承类 A 的成员。类 B 是类 A 的派生
类。 类 B 包含 A 类型的子对象。
你可以同样添加新的数据成员和成员函数到派生类。你可以通过覆盖基类成员函数或者数据在新派生的类中修改已经存在的成
员函数或者数据。
你可以从其他派生类中派生新类,从而建立另外一个层级的继承。下面的例子示例这些:
1 struct A { };
2 struct B : A { };
3 struct C : B { };
类 B 是类 A 的派生类,但是同时是类 C 的基类。 继承的层级仅仅受限于资源。(也就是说,只要内存足够,我们就可以无
限制派生)
多重继承允许你创建一个派生类,其从多个基类继承属性。因为一个派生类继承所有的基类成员,有可能导致混淆(形成冲突
)。例如,如果两个基类包含具有相同名称的变量,派生类不能隐式确定两个变量的差异。注意,当你使用多继承,访问基类
成员的名称可能会形成混淆。
直接基类:就是一个派生类在声明的时候,直接紧跟在“:”号后面的类。
间接基类:
1 class A {
2 public:
3 int x;
4 };
5 class B : public A {
6 public:
7 int y;
8 };
9 class C : public B { };
类 B 是一个类 C 的直接基类。 类 A 是类 B 的直接基类。 类A 是类 C 的间接基类。(类 C 拥有 成员变量 x 和 y)
Polymorphic functions are functions that can be applied to objects of more than one type.
多态函数指的是可以被应用多种数据类型的函数。在C++中, 多态函数有两种实现方式:
- 重载函数——在编译期间静态绑定。
- C++提供的虚函数。虚函数在运行期间动态绑定。