昨天在网上看了一篇博客,大意是想表达用容器之一List实现C++中的多态,作者应该和本人一样,属于初学者,以至于有些知识点没有表达的很清楚。后来查阅了一些资料,如C++ plus等,这里举一个例子来说明一下,有什么叙述不对的地方望大家指正,谢谢!
选择的容器是常用向量vector,也可以说是数组的代替品。先看下程序吧:
1 #include <vector>
2 #include <string>
3 #include <iostream>
4
5 using namespace std;
6
7 class BaseC {
8 public:
9 BaseC(string str1 = "BaseC") {
10 str = str1;
11 }
12 virtual void show() {
13 cout<<str<<endl;
14 }
15
16 private:
17 string str;
18 };
19
20 class SubC1 : public BaseC {
21 public:
22 SubC1(string str1 = "SubC1"):BaseC("BaseC_SubC1") {
23 str = str1;
24 }
25 void show() {
26 cout<<str<<endl;
27 }
28 private:
29 string str;
30 };
31
32 class SubC2 : public BaseC {
33 public:
34 SubC2(string str1 = "SubC2"):BaseC("BaseC_SubC2") {
35 str = str1;
36 }
37 void show() {
38 cout<<str<<endl;
39 }
40 private:
41 string str;
42 };
43
44 int main() {
45
46 BaseC *(Bp[3]); //每一个Bp[i]都是BaseC *类型指针变量,这和(*Bp)[3]区别很大
47
48 Bp[0] = new BaseC(); //基类指针变量指向基类自身对象
49 Bp[0]->show();
50 Bp[1] = new SubC1(); //基类指针变量指向子类对象
51 Bp[1]->show();
52 Bp[2] = new SubC2();
53 Bp[2]->show();
54 Bp[2]->BaseC::show(); //若想用指向子类的指针变量调用基本自身的方法,需加上作用域符号'::'
55
56 //需要对动态分配的内存进行释放
57
58 delete Bp[0]; //注意每个Bp[i]为指针变量,且释放后就不能再用其进行成员访问了
59
60 delete Bp[1]; //比如这里写Bp[1] = new SubC1(); 就会报错
61
62 delete Bp[2]; //不需要delete Bp;因为其本身不是指针变量
63
64 // BaseC::show();直接这样调用不行,show()不是类的static方法,一定得通过对象引用或指针
65
66 //vector来实现同样功能
67 vector<BaseC*>VecB(3);
68
69 VecB[0] = new BaseC("vectorB");
70 VecB[0]->show();
71 VecB[1] = new SubC1();
72 VecB[1]->show();
73 VecB[2] = new SubC2();
74 VecB[2]->show();
75 VecB[2]->BaseC::show();
76
77 return 0;
78 }
这里给出的代码比较简单,看似用一般数组和用vector实现差不多,但实际上不是的。
因为本人初学,还没有水平给出深层次的知识点,但熟悉STL的朋友一定知道,里面的算法和操作是非常灵活,数组所不能及的。比如迭代器,插入操作,内存管理等,继续学习,也希望大家多分享学习经验,一起交流。
原文链接: https://www.cnblogs.com/tgyf/archive/2013/05/08/3066123.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/87603
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!