C ++扩展Windows WRL组件类不起作用
Posted
技术标签:
【中文标题】C ++扩展Windows WRL组件类不起作用【英文标题】:C++ Extend Windows WRL component class not working 【发布时间】:2014-08-08 21:58:15 【问题描述】:我有一个类 ClassA
实现接口 IFooBar
如下所示
class ClassA : public Microsoft::WRL::RuntimeClass<IFooBar>
public:
virtual HRESULT RuntimeClassInitialize(ParamsForClassA);
现在我想写一个ClassB
固有的ClassA
并覆盖它的RuntimeClassInitialize
函数,如下所示:
class ClassB : public ClassA
public:
HRESULT RuntimeClassInitialize(ParamsForClassB)
// implementation goes here
我创建了一个指向 ClassB
对象的指针,如下所示:
ComPtr<ClassB> ptr;
HRESULT hr = MakeAndInitialize<ClassB>(&ptr, ParamsForClassB);
但这实际上是 ClassA
的 RuntimeClassInitialize
构造函数。 ClassB
的 RuntimeClassInitialize
代码路径永远不会被命中。
我想知道这是否是在 WRL 中扩展类的正确方法?我在代码中哪里做错了?
【问题讨论】:
如果参数不同,那么您将拥有 2 个名为 RuntimeClassInitialize 的成员函数。来自 B 的那个不会覆盖来自 A 的那个 @cppguyClassA
和 ClassB
采用不同数量的参数。但我将正确的参数传递给 ClassB 的 MakeAndInitialize
函数。结果神奇地去了A级......
@AllanJiang 你还看到这个问题吗?在我的机器上没问题。
【参考方案1】:
您需要覆盖的方法在两个类上具有相同的签名。
这个
HRESULT RuntimeClassInitialize(ParamsForClassA);
不能被这个覆盖
HRESULT RuntimeClassInitialize(ParamsForClassB);
因为它们采用不同的论点。 这是重载,而不是覆盖。 (而这种重载会导致Name Hiding)
您可以找到签名信息here 或here。
【讨论】:
以上是关于C ++扩展Windows WRL组件类不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在具有绝对路径(例如“C:\...”)的 VSCode 扩展中要求 config.js 文件不起作用