[英]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.