gpt4 book ai didi

基本构造函数中的 C++/CX 委托(delegate)因纯虚拟调用断言而失败

转载 作者:行者123 更新时间:2023-11-30 05:24:15 26 4
gpt4 key购买 nike

我无法理解为什么以下代码因 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 事件的注册是错误行,出于某种原因,它被视为对“我不知道什么”的纯虚拟调用。

我试过这个例子并注意到了一些事情:

  1. 这只有在基类是纯虚拟的情况下才会发生(注意Foo() = 0)

  2. Base::Tick 是 private\public\protected 无关紧要等等……

  3. 我可以(显然)从 Base 构造函数调用 OnTick() 并且它有效

谁有解释?

最佳答案

C++/CX 只是一个编译器包装器来制作 COM对象容易。这意味着对象实现 IUnknown .在Base的构造函数中,IUnknown的虚函数表还没有初始化,所以所有的入口都是“纯虚”的。当您尝试注册 tick 处理程序时,它希望通过调用 IUnknown::AddRef 添加对 this 的引用,直到对象完全构造仍然指向“纯虚拟”实现。

关于基本构造函数中的 C++/CX 委托(delegate)因纯虚拟调用断言而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38770973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com