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的朋友一定知道,里面的算法和操作是非常灵活,数组所不能及的。
比如迭代器,插入操作,内存管理等,继续学习,也希望大家多分享学习经验,一起交流。
后来查阅了一些资料,如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的朋友一定知道,里面的算法和操作是非常灵活,数组所不能及的。
比如迭代器,插入操作,内存管理等,继续学习,也希望大家多分享学习经验,一起交流。
相关文章推荐
- C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
- C++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector).
- C++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector).
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- C++中的动态类型与动态绑定、虚函数、运行时多态的实现
- c/c++ vector 的简单实现
- c++中vector等容器的实现机制
- C++ vector容器简单解释
- 1_c++实现简单vector
- C++虚函数实现动态多态运行
- 用vector、 multimap、 list容器实现好友列表的各种操作 C++
- 用vector、 multimap、 list容器实现好友列表的各种操作 C++
- Vector的简单C++实现
- C++STL库的Vector容器简单实现的源代码参考
- C++ vector容器简单用法
- c++ primer(第五版)笔记 第十三章(4) string 类和 vector<string> 容器的简单实现
- 仿c++的vector简单实现