c++ - 使用具有继承类的容器

标签 c++ inheritance stl polymorphism

所以,我已经有 3 年没有那么多地使用 C++ 了,现在我在将继承的类与 STL 容器一起使用时遇到了一些麻烦。我曾多次看到此类问题被问到,但无法确切理解正在做什么,也无法理解为什么我的代码与答案非常相似时无法运行。

基本上我有两个类,R 和 RD,R 是基类,RD 是派生类。每个元素都有其邻居,有点像图形,因此元素 r1 的邻居可以是类 R 或类 RD。我以为我已经通过在 R 中创建一个私有(private)双端队列来解决这个问题,但是每当我访问所述双端队列中的元素时,它们永远不会是 RD,只有 R。我的代码有点像这样:

class R {
public:
    R();
    ~R();

    inline void queue(R* r) { neighbours.push_back(r); }
    inline R& getFirstNeighbour() { return neighbours.top(); }

    virtual void printSomething() { cout << "R" << endl; }
protected:
    deque<R*> neighbours;
}

class RD: public R {
public:
    RD();
    ~RD();

    void printSomething() { cout << "RD" << endl; }
    void doSomethingElse();
}

每当我得到一个元素的第一个邻居并调用 printSomething 时,我总是得到 R。我在这里做错了什么?应该怎么做?

非常感谢

最佳答案

您的代码有效但有一些错误(构造函数和析构函数缺少“{}”,这是一些有效代码(我在这里使用 std::deque 所以我用 front() 替换了 top() 函数)

#include <deque>
#include <iostream>

using namespace std;


class R {
public:
    R(){};
    ~R(){};
inline void queue(R* r) { neighbours.push_back(r); }


//Here is your error, look at the return : you need to dereference your neighbours.front():
inline R& getFirstNeighbour() { return *neighbours.front(); }

virtual void printSomething() { cout << "R" << endl; }
protected:
    deque<R*> neighbours;
};


class RD: public R {
public:
    RD(){};
    ~RD(){};

    void printSomething() { cout << "RD" << endl; }
    void doSomethingElse();
};


int main()
{
R r;
//R with 3 neighbors
r.queue(new RD());


r.getFirstNeighbour().printSomething(); // Printing RD :)


return 0;
}

关于c++ - 使用具有继承类的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14879756/

相关文章:

python - 删除模型继承并将 id 保留在新创建的自动字段中

c++ - 类模板继承 C++

c# - 派生类中的构造函数错误

c++ - SIGILL 在 ideone 上运行,但在 Codeblocks 上运行时出现警告

c++ - 在 C++ 中获取最小 NEGATIVE 浮点值

c++ - Eigen 实际上扩展了稀疏矩阵

c++ - 括号括起来的实例的销毁

c++ - LibVLC 流式传输到内存 p_audio_data

c++ - std::按成员查找对象

c++ - std::map 导致内存泄漏?