非常感激我队友大爹提供的复习资料

定义

类型兼容规则是指在需要基类对象的任何地方, 都可以使用公有派生类的对象来替代。

类型兼容规则中所指的替代包括以下的情况:

  • 派生类的对象可以隐含转换为基类对象;
  • 派生类的对象可以初始化基类的引用;
  • 派生类的指针可以隐含转换为基类的指针;

在替代之后, 派生类对象就可以作为基类的对象使用, 但只能使用从基类继承的成员。

可以说, 类型兼容原则是多态性的重要基础之一。

示例1

1
2
3
4
class B{};
class D : public B {};
B b, *pb;
D d;

此时:

  • 派生类对象可以隐含转换为基类对象, 即用派生类对象中从基类继承来的成员逐个赋值给基类对象的成员; b=d;
  • 派生类的对象也可以初始化基类对象的引用; B& rb = d;
  • 派生类对象的地址也可以隐含转换为指向基类的指针; pb = &d;

示例2

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
#include <iostream>
using namespace std;

class Base1{
protected:
int _val;
public:
Base1(int val) : _val(val) {}
void display() const { cout << "Base1 val: " << _val << endl; }
};

class Base2 : public Base1{
public:
Base2(int val) : Base1(val) {}
void display() const { cout << "Base2 val: " << _val << endl; }
};

class Derived : public Base2{
public:
Derived(int val) : Base2(val) {}
void display() const { cout << "Derived val: " << _val << endl; }
};

void func(Base1 * ptr){ // 参数为指向基类对象的指针
ptr->display(); // 对象名->成员名
}

int main(void){
Base1 b1(2);
Base2 b2(3);
Derived d(4);

func(&b1);
func(&b2);
func(&d);
b1.display();
b2.display();
d.display();

return 0;
}