您的位置:首页 > 编程语言 > C语言/C++

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

2013-05-08 08:23 399 查看
  昨天在网上看了一篇博客,大意是想表达用容器之一List实现C++中的多态,作者应该和本人一样,属于初学者,以至于有些知识点没有表达的很清楚。

  后来查阅了一些资料,如C++ plus等,这里举一个例子来说明一下,有什么叙述不对的地方望大家指正,谢谢!

  选择的容器是常用向量vector,也可以说是数组的代替品。

  先看下程序吧:  

    //vector简单实现C++运行时多态

#include <vector>
#include <string>
#include <iostream>

using namespace std;

class BaseC
{
public:
  BaseC(string str1 = "BaseC") //这一点非常关键,选择使用用默认参数,避免代码重写(无参数据赋值构造函数),下同
  {
    str = str1; //这里写成str = str;不会成功,但也不会报错,所以尽量在名称上需要加以区别,当然也有其他解决方法
  }
  virtual void show() //显示数据信息函数,加上virtual用于继承后多态的实现
  {
    cout<<str<<endl;
  }
private:
  string str;
};

class SubC1:public BaseC //公有继承,拥有基类的方法和属性,但访问要看各自具体的权限
{
public:
  SubC1(string str1 = "SubC1"):BaseC("BaseC_SubC1") //利用参数列表调用基类构造函数给数据成员赋值
  {
    str = str1;
  }
  void show()
  {
    cout<<str<<endl;
  }
private:
  string str;
};

class SubC2:public BaseC //同上
{
public:
  SubC2(string str1 = "SubC2"):BaseC("BaseC_SubC2")
  {
    str = str1;
  }
  void show()
  {
    cout<<str<<endl;
  }
private:
  string str;
};

int main()

{

// 一般方法实现运行时多态

BaseC *(Bp[3]); //每一个Bp[i]都是BaseC *类型指针变量,这和(*Bp)[3]区别很大

Bp[0] = new BaseC(); //基类指针变量指向基类自身对象
Bp[0]->show();
Bp[1] = new SubC1(); //基类指针变量指向子类对象
Bp[1]->show();
Bp[2] = new SubC2();
Bp[2]->show();
Bp[2]->BaseC::show(); //若想用指向子类的指针变量调用基本自身的方法,需加上作用域符号'::'

//需要对动态分配的内存进行释放

delete Bp[0]; //注意每个Bp[i]为指针变量,且释放后就不能再用其进行成员访问了

delete Bp[1]; //比如这里写Bp[1] = new SubC1(); 就会报错

delete Bp[2]; //不需要delete Bp;因为其本身不是指针变量

// BaseC::show();直接这样调用不行,show()不是类的static方法,一定得通过对象引用或指针

//vector来实现同样功能
vector<BaseC*>VecB(3);

VecB[0] = new BaseC("vectorB");
VecB[0]->show();
VecB[1] = new SubC1();
VecB[1]->show();
VecB[2] = new SubC2();
VecB[2]->show();
VecB[2]->BaseC::show();

return 0;

}

这里给出的代码比较简单,看似用一般数组和用vector实现差不多,但实际上不是的。

因为本人初学,还没有水平给出深层次的知识点,但熟悉STL的朋友一定知道,里面的算法和操作是非常灵活,数组所不能及的。

比如迭代器,插入操作,内存管理等,继续学习,也希望大家多分享学习经验,一起交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: