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

标签 c++ delegates windows-runtime c++-cx pure-virtual

我无法理解为什么以下代码因 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/

相关文章:

javascript - 如何测试 Javascript WinRT/Metro 客户端/服务器应用程序?

directx - 使用 WinRT 组件的 C# XAML Metro 应用程序在异步方法上调用 task.wait() 或 task.get() 抛出 : Unhandled exception 0xc0000409

c++ - OpenGL glfw无法使用着色器绘制点

c++ - 如何在 C++ 中创建不同的对象?

c++ - 从 Objective C 到 C++ 打字头痛

ios - UISearchController & UISearchBar 子类

c# - 在 Windows Phone 8 中获取 UI 调度程序

c++ - C++/编译器/重载中的二维数组

objective-c - 对 Objective-C 中的委托(delegate)有点困惑

c# - 作为服务运行时事件未触发