zoukankan      html  css  js  c++  java
  • 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的朋友一定知道,里面的算法和操作是非常灵活,数组所不能及的。比如迭代器,插入操作,内存管理等,继续学习,也希望大家多分享学习经验,一起交流。

  • 相关阅读:
    第二十一天作业
    第二十天:继承
    第二十天作业
    第十六天
    第十九天作业
    day53
    day52
    day51
    day50
    day44
  • 原文地址:https://www.cnblogs.com/tgyf/p/3066123.html
Copyright © 2011-2022 走看看