C++ 优先级\队列顶部按引用返回
我有以下带有base类型项的优先级队列。 问题是,当我使用top()从队列中获取项时, 然后通过基引用对象调用其f()函数,它确实调用 基类的f,但不是重写的f。 我希望调用子对象的f()。 有什么帮助吗?谢谢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;
#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;
}