1

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

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

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

代码的输出当前是Parent我猜到的Child

我有一种感觉我做错了virtual关键字,应该foo()是一个纯粹的虚函数?

父母.h

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

孩子.h

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

孩子.cpp

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

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

主文件

#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();
}
4

1 回答 1

5

当您尝试使用Basepointer or references来调用derived class函数(虚拟)时,多态就会发挥作用。

在您的情况下,您只需将Child类对象放入priority_queue存储Parent对象的 a 中。本案无涉案pointer或涉案reference类。Parent您将有sliced对象进入优先级队列。因此,当您这样做时:

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

它将输出:

"Parent";

仅供参考:对象切片意味着将子类的对象分配给超类。超类对子类中的附加信息一无所知,因此子类的附加信息被“切掉”。

于 2013-05-24T03:29:24.020 回答