で失敗し、C++/CX代理人は、次のコードは、purvirtの呼び出しで失敗する理由を私は理解できない、純粋仮想コールアサーション
この
を使用して呼び出しますabort();
は、WinRTのプロジェクトはC++/CX
namespace Test {
public delegate void TickHandle();
ref class Clock {
public:
event TickHandle^ Tick;
};
ref class Base {
internal:
Base() :
m_clock(ref new Clock())
{
std::cout << "Base::Base" << std::endl;
m_clock->Tick += ref new Test::TickHandle(this, &Test::Base::OnTick);
OnTick();
}
protected:
virtual void Foo() = 0;
private:
Clock^ m_clock;
void OnTick()
{
std::cout << "Tick" << std::endl;
}
};
ref class Derive : public Base{
internal:
Derive()
{
std::cout << "Derive::Derive" << std::endl;
}
protected:
void Foo() override
{
std::cout << "Derive::Foo" << std::endl;
}
};
void main()
{
auto y = ref new Test::Derive();
}
}
Tick
イベントへの登録が何らかの理由に純粋仮想コールと考えられているI-ドント・ノウ何を断層ラインです。
私は、この例で遊んといくつかのことに気づいた:
基本クラスは純粋仮想である場合にのみ起こる(
Foo() = 0
に気づく)それがあれば問題ありません。
Base::Tick
が...プライベート\パブリック\は などを保護である私は(当然)から
OnTick()
を呼び出すことができますコンストラクタです。
誰でも説明がありますか?
このコードを取得するためのスローグのビット。 QueryInterfaceは失敗します。 C++ルールは、コンストラクターの実行中にv-tableが非仮想関数を指すように要求します。 C++コンパイラは、何らかの形で、クラスに純粋な関数がないときにそのルールを回避することを知っています。抽象基本クラスでそのトリックが機能しない理由はあまり明確ではありません。回避策は、オブジェクトを構築した後に呼び出す別の関数にイベント割り当てを移動することです。 –