从Vector :: Vector基类继承

Aid*_*hjj 0 c++ vector

我试图了解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] << " ";
}
Run Code Online (Sandbox Code Playgroud)

当我按原样跑时,我得到:

0xffffcb68 0xffffcb68
Run Code Online (Sandbox Code Playgroud)

即同一地址.

当我试图尊重sv[i](即*sv[i]); 我得到一个例外.谁能告诉我哪里出错了?

krz*_*zaq 7

你正在推动&str哪个获取指针的地址,所以你要推的类型是string**.更重要的是,你正在存储一个短期变量(指针)的地址 - 一旦你离开你的重载就会被破坏push_back.

立即修复是简单地更改push_back方法(删除const字符串并将指针传递给vector::push_back):

void push_back(string* str) {
    vector::push_back(str);
}
Run Code Online (Sandbox Code Playgroud)

这与简单地完全删除方法和使用继承方法一样好.

话虽这么说,从大多数标准容器继承是一个坏主意.你可以有一个vectorstring只需键入指针vector<string*>.

如果要打印字符串值而不是指针,则需要取消引用它们:

for (int i = 0; i < 2; i++)
    cout << *sv[i] << " ";
Run Code Online (Sandbox Code Playgroud)