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

  • 相关阅读:
    使用 libevent 和 libev 提高网络应用性能
    An existing connection was forcibly closed by the remote host
    各种浏览器的兼容css
    vs输出窗口,显示build的时间
    sass
    网站设置404错误页
    List of content management systems
    css footer not displaying at the bottom of the page
    强制刷新css
    sp_executesql invalid object name
  • 原文地址:https://www.cnblogs.com/tgyf/p/3066123.html
Copyright © 2011-2022 走看看