多态实验

组合模式的应用

每个公司都有总部、多个分公司、多个办事处等,为上下级同构实体关系。每个实体均有人力部、财务部、销售部等职能部门,不再有下级部门。分公司下面继续有子公司……总部需要快速了解总公司的:组织结构+实体职责展示。(两个多态函数,输出文字即可)。

关于组合模式和程序的分析

“组合模式”指的是将对象组合成树形结构以表示“部分—整体”的一种层次结构。这就需要实验人将“总公司”、“子公司”、“办事处”及其部门实体等对象抽象成为一个组合模式结构,例如:

参考结构示意图

在我们的模拟程序中就可以用类模拟一个子公司或总公司,其中包含子公司和办事处类的指针。而子公司类和办事处类都拥有人力部、财务部、销售部等基本部门,这就可以通过继承一个基本实体类来实现。

这样我们就可以构造出一个树结构了,类定义的代码class.h如下:

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
#pragma once
#include <string>
#include <vector>
class Base
{
public:
std::string Func1;
std::string Func2;
std::string Func3;
Base();
virtual void show() = 0;
};
class Agency :public Base
{
std::string Func;
public:
int tag;
Agency();
virtual void show();
};
class Company :public Base
{
public:
int tag;
std::vector <Company*> Branches;
std::vector <Agency*> Agencies;
Company() = default;
Company(int branchnum, int agencynum, int num);
virtual void show();
};

其中,类Base有一个纯虚成员函数show(),是一个抽象类,它代表着基本职能实体的信息;类Agency封装着办事处的信息,继承自类Base;类Company代表着子公司或总公司,也是继承自类Base,存储着Company指针和Agency指针,代表其衍生出来的子公司和办事处。

各个类的构造函数可以参考class.cpp

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
Base::Base()
{
Func1 = "人力部";
Func2 = "财务部";
Func3 = "销售部";
}
Agency::Agency()
{
Func = "办事处";
tag = 0;
}
Company::Company() = default;
Company::Company(int branchnum, int agencynum, int num)
{
tag = num;
for (int i = 0; i < branchnum; i++)
{
Branches.push_back(new Company);
Branches[i]->tag = i + 1;
}
for (int i = 0; i < agencynum; i++)
{
Agencies.push_back(new Agency);
Agencies[i]->tag = i + 1;
}
}

show()函数是类中的一个虚函数,在Company类和Agency类中都对它进行了定义的覆盖,以达到多态的目的,这样,调用不同的类中的show()函数就可以做到不同的效果。例如,调用Agency中的show(),会输出它自己的基本信息和它父类Base的一些信息;调用Company中的show(),会输出它自己以及所有子公司和办事处的信息。具体代码如下:

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
void Agency::show()
{
std::cout << "办事处" << tag << "职能有:" << std::endl;
std::cout << Func << ' ' << Func1 << ' ' << Func2 << ' ' << Func3 << std::endl;
}
void Company::show()
{
if (tag != 0)
{
std::cout << "子公司" << tag << "下属有:" << std::endl;
}
else
{
std::cout << "总公司下属有:" << std::endl;
}
std::cout << Func1 << ' ' << Func2 << ' ' << Func3 << std::endl;
if (!Agencies.empty())
{
std::cout << Agencies.size() << "个办事处" << std::endl;
for (int i = 0; i < Agencies.size(); i++)
{
Agencies[i]->show();
}
}
if (!Branches.empty())
{
std::cout << Branches.size() << "个子公司" << std::endl;
for (int i = 0; i < Branches.size(); i++)
{
Branches[i]->show();
}
}
}

测试与实现可参考main.cpp

1
2
3
4
5
6
7
8
9
10
11
#define _CRT_SECURE_NO_WARNINGS
#include "class.h"
#include <iostream>
using namespace std;
int main()
{
Company Com(10, 5, 0);
Com.Branches[2]->
Branches.push_back(new Company(3, 0, Com.Branches.size() + 1));
Com.show();
}

调用结果

可以看到,我们的操作都是实现了的。

注意事项

  • 构造函数需要放在public里面
  • 加一个static变量观感会更好,但是要注意类内声明类外定义

多态实验
https://blog.kisechan.space/2024/polymorphic/
作者
Kisechan
发布于
2024年5月25日
更新于
2024年5月27日
许可协议