簡體   English   中英

C ++ 11優先級隊列中的繼承的類

[英]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();
}

當您嘗試使用Basepointer or references來調用derived class函數(虛擬)時,多態性就發揮了作用。

在您的情況下,您只需將Child類的對象放入存儲Parent對象的priority_queue中。 在這種情況下,沒有涉及Parent類的pointerreference 您將把對象sliced到優先級隊列中。 因此,當您執行以下操作時:

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

它將輸出:

"Parent";

僅供參考:對象切片意味着將子類的對象分配給超類時。 超類對子類中的附加信息一無所知,因此子類的附加信息被“分割”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM