继承Vector: Vector基类
Inheritance from Vector::Vector base class
我正在学习c++中的继承。我想创建一个vector::vector
的子类它只取string
的指针。
我对指针和引用的把握确实很弱,但我不能用我的生命来解决为什么下面的代码将每个string
设置为相同的地址:
#include <iostream>
#include <vector>
using namespace std;
class StringVector : public vector<void*> {
public:
void push_back(const string* str) {
vector::push_back(&str);
}
string* operator[](int pos) {
return (string*)vector::operator[](pos);
}
};
main() {
StringVector sv;
string str1 = "hello";
string str2 = "world";
sv.push_back(&str1);
sv.push_back(&str2);
for (int i = 0; i < 2; i++)
cout << sv[i] << " ";
}
当我按原样运行时,得到:
0xffffcb68 0xffffcb68
。相同地址。
当我尝试遵从sv[i]
(即*sv[i]
)时;我得到一个异常。谁能告诉我哪里错了?
您正在推送&str
,它采用指针的地址,因此您正在推送的类型是string**
。更重要的是,您正在存储一个短寿命变量(指针)的地址-一旦您离开重载的push_back
,它就会被销毁。
立即修复是简单地改变push_back
方法(删除const
在string和传递指针到vector::push_back
):
void push_back(string* str) {
vector::push_back(str);
}
,这与简单地完全删除方法并使用继承的方法一样好。
也就是说,从大多数标准容器继承是一个坏主意。您可以通过输入vector<string*>
来获得vector
或string
指针。
如果要打印字符串值而不是指针,则需要对它们解引用:
for (int i = 0; i < 2; i++)
cout << *sv[i] << " ";
在这个函数中
void push_back(const string* str) {
vector::push_back(&str);
}
你没有压入string对象的地址——你压入了指向string对象的指针的地址。在连续的调用中,两个不同的指针可能被存储在同一个位置(尽管在不同的时间)。
因为你的vector对象是void*
,而任何指针都可以转换为void*
,所以编译器没有机会提醒你的错误。您可能想要使用std::vector<std::string*>
或std::vector<const std::string*>
。你不应该继承标准集合;更倾向于使用它们作为成员。
考虑一下void*
和强制类型转换的危险吧!
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 指向基类的指针的 std::vector 的深层副本
- STL 容器列表、deque、vector 等的基类是什么?
- 在c++中推回基类类型2d vector中的子类对象
- 将派生类的unique_ptr添加到基类unique_ptr的vector上
- 通过 <vector> 删除复制构造函数等,按值(无指针)将具有相同基类的对象存储在C++中
- 继承Vector: Vector基类
- 从基类ptr的vector对象中擦除
- 需要指导:从抽象基类到派生类的unique_ptr的vector对象