首页 > 解决方案 > 从子类调用基类的受保护构造函数不起作用

问题描述

我有一个需要子类化的 C++/WinRT 基类。我的问题是我无法从子类中调用基类的受保护构造函数。

该基类在 MIDL 中定义如下:

namespace My.Custom.WindowsRuntimeComponent
{
  unsealed runtimeclass BaseClass : Windows.UI.Xaml.Controls.SwapChainPanel
  {
  }
}

从中创建以下标头和实现:

#pragma once

#include <DirectXMath.h>
#include "BaseClass.g.h"

namespace winrt::My::Custom::WindowsRuntimeComponent::implementation
{
  struct BaseClass : BaseClassT<BaseClass>
  {
  protected:
    BaseClass();
    ::DirectX::XMFLOAT3 ProtectedMethod();
  };
}
#include "pch.h"
#include "BaseClass.h"
#include "BaseClass.g.cpp"

namespace winrt::My::Custom::WindowsRuntimeComponent::implementation
{
  BaseClass::BaseClass()
  {
    // Important stuff happening here
  }

  ::DirectX::XMFLOAT3 BaseClass::ProtectedMethod()
  {
    return ::DirectX::XMFLOAT3();
  }
}

子类的 MIDL、header 和 implementation 定义如下:

import "BaseClass.idl";

namespace My.Custom.WindowsRuntimeComponent
{
  runtimeclass SubClass : BaseClass
  {
    SubClass();
    void UseProtectedMethod();
  }
}
#pragma once

#include "BaseClass.h"
#include "SubClass.g.h"

namespace winrt::My::Custom::WindowsRuntimeComponent::implementation
{
  struct SubClass : SubClassT<SubClass, My::Custom::WindowsRuntimeComponent::implementation::BaseClass>
  {
    SubClass();
    void UseProtectedMethod();
  };
}

namespace winrt::My::Custom::WindowsRuntimeComponent::factory_implementation
{
  struct SubClass : SubClassT<SubClass, implementation::SubClass>
  {
  };
}
#include "pch.h"
#include "SubClass.h"
#include "SubClass.g.cpp"

namespace winrt::My::Custom::WindowsRuntimeComponent::implementation
{
  SubClass::SubClass()
  {
  }

  void SubClass::UseProtectedMethod()
  {
    ::DirectX::XMFLOAT3 value = ProtectedMethod();
  }
}

上面的例子编译。但是,如果我尝试从子类的初始化程序列表中调用受保护的基类构造函数,如下所示,我会收到编译器错误。

#include "pch.h"
#include "SubClass.h"
#include "SubClass.g.cpp"

namespace winrt::My::Custom::WindowsRuntimeComponent::implementation
{
  SubClass::SubClass() : BaseClass() // This line does not compile
  {
  }

  void SubClass::UseProtectedMethod()
  {
    ::DirectX::XMFLOAT3 value = ProtectedMethod();
  }
}

编译器错误如下: error C2614: 'winrt::My::Custom::WindowsRuntimeComponent::implementation::SubClass': illegal member initialization: 'BaseClass' is not a base or member

在 MIDL 和 I 的标头中都SubClass指定它继承自,BaseClass因此我不清楚为什么编译器会发出该错误。

我想我可以解决这个问题,但我很好奇这里到底发生了什么。有什么提示吗?

标签: c++windows-runtimec++-winrtcppwinrt

解决方案


SubClass命名空间中的源自winrt::...SubClassT<...>而不是源自SubClass。命名空间之外的那个
派生自BaseClass,但那是一个不同的。你的命名很容易迷失。SubClasswinrt::


推荐阅读