我明白你爲什麼不能簡單地將派生類成員函數指針轉到基類成員函數指針,如解釋here。演員派生虛擬覆蓋基地純虛擬成員
但是,鑑於這個片段:
struct base
{
virtual void foo() = 0;
};
struct derived : base
{
void foo() override {};
};
struct invoker
{
typedef void(base::*target)();
invoker(base* b, target t)
{
(b->*t)();
}
};
template<typename B, typename D>
void (B::*cast(void (D::*method)()))()
{
return static_cast<void(B::*)()>(method);
}
derived d;
invoker bad(&d, &derived::foo); //C2664
invoker good(&d, cast<base>(&derived::foo));
我想問問有沒有可能使編譯器理解它來裝飾基函數簽名是一個純虛方法,它會某處跨層次結構來實現(否則我不能構造一個B
類型的對象)?我明白爲什麼我不能用普通函數做到這一點,但恕我直言,在純虛函數的情況下,編譯器有保證它會被執行(如果沒有完成,我會得到關於類B
的錯誤,而不是關於投)。
目前還不清楚你要求什麼樣的裝飾。如果你是C++設計委員會的最高領導,你會怎麼做?不要擔心一致性或正確性,只需顯示您想要添加到C++中的內容即可。如果你只是想告訴編譯器在'base'中存在'derived :: foo',你可以直接寫'&base :: foo'。 –
@ n.m。我想避免做出明確的演員:D但它更像是「我有沒有意識到某種方式」的問題類型。 –
不,不要演員。只需從&base :: foo開始。 '&derived :: foo'做什麼'&base :: foo'不能做什麼? –