基构造函数中的 C++/CX 委托失败,并出现纯虚拟调用断言
C++/CX Delegate in base constructor fails with pure virtual call assertion
我不明白为什么以下代码失败并调用 purvirt 调用并调用abort();
这是一个使用 C++/CX 的 WinRT 项目
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
是私有\公共\受保护并不重要等。。。我可以(显然(从构造函数调用
OnTick()
Base
并且可以工作
有人得到解释吗?
C++/CX 只是一个编译器包装器,用于简化 COM 对象。这意味着实现 IUnknown 的对象。在 Base
的构造函数中,IUnknown
的虚函数表尚未初始化,因此所有条目都是"纯虚拟"。当您尝试注册 tick 处理程序时,它希望通过调用 IUnknown::AddRef
来添加对 this
的引用,在对象完全构造之前,该引用仍指向"纯虚拟"实现。
相关文章:
- 什么时候调用组成单元对象的析构函数
- Boost Beast 异步服务器失败,断言失败:(id_ != T::id) 在多个 aync 调用中
- 如何断言只有当调用对象是常量值时才能调用方法?
- 谷歌测试有没有办法为被调用函数中的断言生成调用方行号
- 优雅断言函数不是从多个线程调用的
- MFC DDX_RADIO会导致调用dodataexchange(dlgdata.cpp行286)时导致调试断言失败
- OpenCV c++ 断言失败调用绘制轮廓
- 断言调用返回的函数的签名 &(引用)
- 调试断言失败!vector.earse() 调用期间出错
- OpenCV 错误:调用检测多尺度时断言失败
- 在 Xcode [c++] 中在断言 (assert.h) 中定义 lambda 时,为类似函数的宏调用提供过多参数会导
- 调用 LoadFrame() MFC、RIBBON、VS2008 C++ 时断言失败
- 调用运算符delete时的断言
- 如何在跟踪断言失败时知道调用方函数
- 调试断言失败-DirectShow筛选器正在调用OpenCV函数-仅限发布模式
- 在从全局对象调用的静态库函数中使用std::vector时,调试断言失败
- 当尝试使用类的实例调用方法时,调试断言错误
- 是否可以尝试在静态库(c++)中捕获断言调用?
- 基构造函数中的 C++/CX 委托失败,并出现纯虚拟调用断言
- 从 C/C++ 调用 Prolog 时将事实传达给 Prolog(不使用断言)