CPP学习之——动态联编(11.7-8)

一 概述

上一节讲述了静态联编,本节讲述动态联编,动态联编分为:编译时动态联编和运行时动态联编

二 编译时动态联编

2.1 概念

从对静态联编的上述实例中可以知道,编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序执行时才能确定将要调用的函数,为此要确切知道该调用的函数,要求联编工作要在程序运行时进行,这种在程序运行时进行联编工作被称为动态联编,或称动态束定,又叫晚期联编

2.2 示例演示及结果输出

2.2.1 代码

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
#include<iostream>
using namespace std;
class A
{
public:virtual int get() {return 1;}
};
class B: public A
{
public:int get() {return 2;}
};
int main()
{
while (true)
{
cout << "(1)父类(2)子类(3)退出:";
int choice;
cin >> choice;
A *p;
bool quit = false;
switch (choice) {
case 1:
p = new A;
break;
case 2:
p=new B;
break;
case 3:
quit=true;
break;
default:
cout<<"请输入1 、2或者3.";
break;
}
if(quit==true){
break;
}
cout<<p->get()<<endl;
}
return 0;
}

2.2.2 输出结果

1
2
3
4
5
(1)父类(2)子类(3)退出:1
1
(1)父类(2)子类(3)退出:2
2
(1)父类(2)子类(3)退出:3

2.2.3 代码说明

  • 此时,动态联编时使用指针 A *p;

三 运行时动态联编

3.1 运行联编说明

假如我们在虚函数中没有采用指针或者引用,那么就无法实现动态联编

3.2 示例演示及代码输出

3.2.1 代码

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
#include<iostream>
using namespace std;
class A
{
public:virtual int get() {return 1;}
};
class B: public A
{
public:int get() {return 2;}
};
int main()
{
while (true)
{
cout << "(1)父类(2)子类(3)退出:";
int choice;
cin >> choice;
A p;
bool quit = false;
switch (choice) {
case 1:
p = A();
break;
case 2:
p= B();
break;
case 3:
quit=true;
break;
default:
cout<<"请输入1 、2或者3.";
break;
}
if(quit==true){
break;
}
cout<<p.get()<<endl;
}
return 0;
}

3.2.2 输出结果

1
2
3
4
5
(1)父类(2)子类(3)退出:1
1
(1)父类(2)子类(3)退出:2
1
(1)父类(2)子类(3)退出:

3.2.3 代码说明

  • 此时,没有使用指针或者引用A p;