Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 优先级\队列顶部按引用返回_C++_Inheritance_Priority Queue - Fatal编程技术网

C++ 优先级\队列顶部按引用返回

C++ 优先级\队列顶部按引用返回,c++,inheritance,priority-queue,C++,Inheritance,Priority Queue,我有以下带有base类型项的优先级队列。 问题是,当我使用top()从队列中获取项时, 然后通过基引用对象调用其f()函数,它确实调用 基类的f,但不是重写的f。 我希望调用子对象的f()。 有什么帮助吗?谢谢 #include <queue> #include <iostream> using namespace std; class base { public: int id;

我有以下带有base类型项的优先级队列。 问题是,当我使用top()从队列中获取项时, 然后通过基引用对象调用其f()函数,它确实调用 基类的f,但不是重写的f。 我希望调用子对象的f()。 有什么帮助吗?谢谢

    #include <queue>
    #include <iostream>

    using namespace std;

    class base {

        public:
            int id;

            virtual void f() const {

                cout << "base f()" << endl;
            }

    };

    class D1: public base {

        public:

            void f() const {

                cout << "D1 f()" << endl;
            }

    };

    class D2: public base {

        public:

            void f() const {

                cout << "D2 f()" << endl;
            }

    };

    bool operator<(const base& b1, const base& b2)
            {
        return b1.id > b2.id;
    }

    int main()
    {

        priority_queue<base, deque<base>, less<deque<base>::value_type> > Q;

        D1 d1;
        D2 d2;

        Q.push(d1);
        Q.push(d2);

// this is not something  I want
        const base& b = Q.top();
        b.f();        // base f()


// this works as I want
    const base& b2 = d2;
    b2.f();        // D1 f()

    return 0;

    }
#包括
#包括
使用名称空间std;
阶级基础{
公众:
int-id;
虚空f()常量{

不能使用与使用指针相同的多态前提,但这里有一种可能的替代方法,使用:

#包括
#包括
#包括
使用名称空间std;
阶级基础{
公众:
int-id;
虚空f()常量{

您应该使用
shared\u ptr
,因为它们本质上是多态的。下面的代码使用
shared\u ptr

#include <queue>
#include <iostream>

using namespace std;

class base {

    public:
        int id;

        virtual void f() const {

            cout << "base f()" << endl;
        }

};

class D1: public base {

    public:

        void f() const {

            cout << "D1 f()" << endl;
        }

};

class D2: public base {

    public:

        void f() const {

            cout << "D2 f()" << endl;
        }

};

bool operator<(const base& b1, const base& b2)
{
    return b1.id > b2.id;
}

int main()
{

    priority_queue<std::shared_ptr<base>, deque<std::shared_ptr<base>>, less<deque<std::shared_ptr<base>>::value_type>> Q;

    D1 d1;
    D2 d2;

    Q.push(std::make_shared<D1>(d1));
    Q.push(std::make_shared<D2>(d2));

    // Works!
    const shared_ptr<base> b = Q.top();
    b->f();        // D1 f()

    return 0;

}
#包括
#包括
使用名称空间std;
阶级基础{
公众:
int-id;
虚空f()常量{

如果你想要多态行为,你需要在容器中存储指针。我尝试过,它工作过,但是我有奇怪的运行时错误,因此我想避免它。这是唯一的方法吗?那么,回到几乎工作的程序,集中精力修复奇怪的运行时错误。我不会。还有其他的想法吗?C++标准库不支持多态联合的想法。
std::variant
是非多态的。因此,除非你想接受一些真正的专家的编码,否则最好使用指针。尝试只存储
shared_ptr
实例。这样可以最大限度地减少对象生命周期的问题。谢谢。我会尝试。使用g++5.4,我得到了“RealthyTyWrpApER”不是“STD”错误的成员。不幸的是,您需要使用C++或11或更高版本来使用这个或智能指针。"指针是解决问题的方法。谢谢Phil。至少C++11对此有一个解决方案。请注意,这与存储指针具有相同的生存期问题-当对象超出范围时,对本地对象的引用将以与指针完全相同的方式悬空。您仍然需要在对象的某个位置创建一个过期的副本本地范围-即堆上。抱歉,我忘了提及我在嵌入式平台上,只有c++03,因此无法使用共享\u ptr。谢谢。不清楚此处是否需要共享所有权。如果有疑问,请不要共享!
#include <queue>
#include <iostream>

using namespace std;

class base {

    public:
        int id;

        virtual void f() const {

            cout << "base f()" << endl;
        }

};

class D1: public base {

    public:

        void f() const {

            cout << "D1 f()" << endl;
        }

};

class D2: public base {

    public:

        void f() const {

            cout << "D2 f()" << endl;
        }

};

bool operator<(const base& b1, const base& b2)
{
    return b1.id > b2.id;
}

int main()
{

    priority_queue<std::shared_ptr<base>, deque<std::shared_ptr<base>>, less<deque<std::shared_ptr<base>>::value_type>> Q;

    D1 d1;
    D2 d2;

    Q.push(std::make_shared<D1>(d1));
    Q.push(std::make_shared<D2>(d2));

    // Works!
    const shared_ptr<base> b = Q.top();
    b->f();        // D1 f()

    return 0;

}