c++ - 从子类调用基类的受保护构造函数不起作用
问题描述
我有一个需要子类化的 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
因此我不清楚为什么编译器会发出该错误。
我想我可以解决这个问题,但我很好奇这里到底发生了什么。有什么提示吗?
解决方案
SubClass
命名空间中的源自winrt::...
,SubClassT<...>
而不是源自SubClass
。命名空间之外的那个
派生自BaseClass,但那是一个不同的。你的命名很容易迷失。SubClass
winrt::
推荐阅读
- javascript - Javascript中是否有一种简单的方法可以使用字典对字符串进行编码?
- c++ - 基于 OO 的 C++ 库的 C 和 C++ 接口
- python - 线性回归 - Tensorflow
- flutter - 颤振创建失败“找不到 pubspec.yaml”
- javascript - 如何比较 2 个计时器 Javascript
- three.js - Threejs几何顶点顺序
- javascript - 如何迭代不同的变量/状态来创建一个对象?
- python-3.x - 如果代码中没有 Tk() 声明怎么办
- python - PYOMO 优化以满足供给 < 需求
- python - 为什么 tkinter 不抛出/引发异常?