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的朋友一定知道,里面的算法和操作是非常灵活,数组所不能及的。比如迭代器,插入操作,内存管理等,继续学习,也希望大家多分享学习经验,一起交流。
不要让青春留下太多遗憾,专注