簡體   English   中英

將指針或引用傳遞給派生類,以便調用基類方法

[英]Pass a pointer or reference to derived class such that base class method is called

我有一個派生類和一個基類,它們都覆蓋相同的虛函數。 如何將其他函數傳遞給派生類的實例的指針或引用,但仍然調用基類的虛函數版本?


我似乎與這個問題恰恰相反。 我實際上想要切割我的派生對象,使它看起來像一個基礎對象(假設我可以安全地這樣做),但無法弄清楚如何做到這一點。

我有一大堆復制成本很高的數據,所以我改為傳遞一個允許迭代的輕量級view對象。 我有一個接口,各種數據集繼承,以宣傳他們可以提供一個view

class data_interface
{
    virtual view get_view() = 0;
};

有一個基類擁有其中一個數據集,並可根據請求提供它的視圖:

class base_owns_data : public data_interface
{
public:
    view get_view() override
    {
        return view(d);
    }

private:
    data d;
};

這個課程孤立無援。 我的應用程序通過引用自由函數來傳遞它,以便獲得更復雜的數據視圖:

view some_process(base_owns_data &b)
{
    auto working_view = b.get_view();
    // Do a bunch of things to filter the view
    return working_view;
}

(請注意,上面的內容被刪除了MCVE - 在這里,直接獲取一個view參數更有意義,但在上下文中我正在組合幾個數據集,其中一個需要擁有存儲而不僅僅是擁有視圖它))

當我嘗試使用另一個需要進行額外處理的基礎數據集擴展時,會出現問題。 這是一個派生類:

class derived_owns_data : public base_owns_data
{
public:
    base_owns_data& as_base()
    {
        return *this;
    }

    view get_view() override
    {
        return some_process(this->as_base());   
    }
};

我想要發生的是,因為some_process正在傳遞對base_owns_data的引用,所以base_owns_data::get_view()將在some_process被調用。

實際發生的是some_process仍調用derived_owns_data::get_view() 這導致無限循環,因為這兩個函數來回互相調用。

我不知道該怎么做 - 我無法從界面中刪除virtual ,或者界面變得無用。 我也不想復制數據。 但我無法弄清楚如何強制base_owns_data::get_view()被調用的類型的引用derived_owns_data

我嘗試傳遞指針而不是引用,但這似乎仍然導致無限循環。

如何安全地使派生類看起來some_process的基類?


完整MCVE(或在ideone上 ):

struct data
{
    char c[100];
};

class view
{
public:
    view(data d) :
        first(&d.c[0]),
        last(&d.c[100])
    {

    }
private:
    char * first;
    char * last;
};

class data_interface
{
    virtual view get_view() = 0;
};

class base_owns_data : public data_interface
{
public:
    view get_view() override
    {
        return view(d);
    }

private:
    data d;
};

view some_process(base_owns_data &b)
{
    return b.get_view();
}

class derived_owns_data : public base_owns_data
{
public:
    base_owns_data& as_base()
    {
        return *this;
    }

    view get_view() override
    {
        return some_process(this->as_base());   
    }
};


int main() {
    derived_owns_data d;
    d.get_view();
    return 0;
}

您必須從基類顯式調用overriden函數:

view some_process(base_owns_data &b)
{
    auto working_view = b.base_owns_data::get_view();
    // Do a bunch of things to filter the view
    return working_view;
}

暫無
暫無

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

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