我无法理解为什么以下代码因 purvirt 调用而失败并调用 abort();
This is a WinRT project using 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
事件的注册是错误行,出于某种原因,它被视为对“我不知道什么”的纯虚拟调用。
我试过这个例子并注意到了一些事情:
这只有在基类是纯虚拟的情况下才会发生(注意
Foo() = 0
)Base::Tick
是 private\public\protected 无关紧要 等等……我可以(显然)从
Base
构造函数调用OnTick()
并且它有效
谁有解释?
最佳答案
C++/CX 只是一个编译器包装器来制作 COM对象容易。这意味着对象实现 IUnknown .在Base
的构造函数中,IUnknown
的虚函数表还没有初始化,所以所有的入口都是“纯虚”的。当您尝试注册 tick 处理程序时,它希望通过调用 IUnknown::AddRef
添加对 this
的引用,直到对象完全构造仍然指向“纯虚拟”实现。
关于基本构造函数中的 C++/CX 委托(delegate)因纯虚拟调用断言而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38770973/