[英]Inherited classes in a C++11 priority queue
我是C ++中OOP的新手,我不確定這是否行得通,但我想在C ++ std優先級隊列中具有多個類類型。
我設置了類,以便它們都繼承自基類,然后使用基類來創建所有函數,但是我只是不知道如何使所有內容都調用子類函數。 當我調用foo()
函數時,它調用父函數而不是子函數
有沒有一種方法可以在不明確知道其類型的情況下進行回退? 我將有幾個不同的子類,它們將完成不同的功能,而不僅僅是顯示的單個類。
當我以為是Child
時,代碼的輸出當前為Parent
。
我感覺我對virtual
關鍵字做錯了, foo()
應該是純虛擬函數嗎?
父母
#pragma once
class Parent{
public:
virtual ~Parent(){};
virtual std::string foo() const { return "Parent"; }
};
兒童
#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
類pointer or references
來調用derived class
函數(虛擬)時,多態性就發揮了作用。
在您的情況下,您只需將Child
類的對象放入存儲Parent
對象的priority_queue
中。 在這種情況下,沒有涉及Parent
類的pointer
或reference
。 您將把對象sliced
到優先級隊列中。 因此,當您執行以下操作時:
cout << pq.top().foo() << endl;
它將輸出:
"Parent";
僅供參考:對象切片意味着將子類的對象分配給超類時。 超類對子類中的附加信息一無所知,因此子類的附加信息被“分割”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.