c++ - C++11 优先级队列中的继承类

标签 c++ inheritance priority-queue

我是 C++ 中 OOP 的新手,我不确定这是否可行,但我希望在 C++ std 优先级队列中有多个类类型。

我设置了类,以便它们都继承自基类,然后使用基类来创建所有函数,但我只是不知道如何让所有的东西都调用子类函数。在我调用 foo() 函数时,它调用父函数而不是子函数

有没有办法在不明确知道它是什么类型的情况下进行强制转换?我将有几个不同的子类,它们将做不同的事情,而不仅仅是显示的那个。

代码的输出当前是 Parent,而我猜它是 Child

我感觉 virtual 关键字有问题,foo() 应该是一个纯虚函数吗?

Parent.h

#pragma once
class Parent{
    public:
        virtual ~Parent(){};
        virtual std::string foo() const { return "Parent"; }
};

Child.h

#pragma once
#include <iostream>
#include "Parent.h"
class Child: public Parent{
    public:
        Child();
        ~Child();
        std::string foo() const;
};

Child.cpp

#include <iostream>
#include "Parent.h"
#include "Child.h"

Child::Child(){}
Child::~Child(){}
std::string Child::foo() const{ return "Child"; }

main.cpp

#include <iostream>
#include <queue>
#include "Parent.h"
#include "Child.h"
using namespace std;

//Fake compare function for compilation, real one calls a compare method
class comparefunction{
    public:
        bool operator()( const Parent& p1, const Parent& p2) const{
            return true;
        }
};

int main(){
    priority_queue<Parent, vector<Parent>, comparefunction> pq;
    Child c;

    pq.push(c);

    cout << pq.top().foo() << endl;
    pq.pop();
}

最佳答案

当您尝试使用Base指针或引用 来调用派生类 函数(虚拟)时,多态性开始发挥作用。

在您的情况下,您只需将 Child 类的对象放入存储 Parent 对象的 priority_queue 中。本例中不涉及父级类的指针引用。您会将 sliced 对象放入优先级队列中。因此,当您这样做时:

cout << pq.top().foo() << endl;

它会输出:

"Parent";

仅供引用:对象切片意味着当您将子类的对象分配给父类(super class)时。父类(super class)对子类的附加信息一无所知,因此子类的附加信息被“切掉”。

关于c++ - C++11 优先级队列中的继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16727220/

相关文章:

c++ - 警告 C26495 从构造函数调用函数来初始化变量,为什么?

Javascript:从基类继承方法并返回子类的私有(private)变量

C++ 符号引用错误

java - Java中PriorityQueue类的加法操作

java - Dijkstra算法-优先级队列问题

c++ - TBB 与 C++ 的链接

c++ - MSVC 中的虚拟继承错误

c++ - 如何遍历基类对象的 vector ?

java - 为什么 Java 不允许多重继承,但允许遵循具有默认实现的多个接口(interface)

c++ - 我如何在优先队列中找到值(value)?