SLT容器之vector简单实现C++运行时多态

昨天在网上看了一篇博客,大意是想表达用容器之一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的朋友一定知道,里面的算法和操作是非常灵活,数组所不能及的。比如迭代器,插入操作,内存管理等,继续学习,也希望大家多分享学习经验,一起交流。

posted @ 2013-05-08 08:23  路上的脚印  阅读(1405)  评论(0编辑  收藏  举报