aw4*_*lly 1 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"; }
};
Run Code Online (Sandbox Code Playgroud)
Child.h
#pragma once
#include <iostream>
#include "Parent.h"
class Child: public Parent{
public:
Child();
~Child();
std::string foo() const;
};
Run Code Online (Sandbox Code Playgroud)
Child.cpp
#include <iostream>
#include "Parent.h"
#include "Child.h"
Child::Child(){}
Child::~Child(){}
std::string Child::foo() const{ return "Child"; }
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
当您尝试使用Base类pointer or references来调用derived class函数(虚拟)时,多态性开始发挥作用.
在您的情况下,您只需将Child类的对象放入priority_queue存储Parent对象的对象中.有没有pointer或reference对Parent涉案类.您将有sliced对象进入优先级队列.因此,当你这样做时:
cout << pq.top().foo() << endl;
Run Code Online (Sandbox Code Playgroud)
它将输出:
"Parent";
Run Code Online (Sandbox Code Playgroud)
仅供参考:对象切片是指将子类的对象分配给超类时.超类对子类中的附加信息一无所知,因此子类的附加信息被"切掉".