使用从WinRT Grid Class派生的抽象类时,CastToBase是否解决了外部符号错误?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用从WinRT Grid Class派生的抽象类时,CastToBase是否解决了外部符号错误?相关的知识,希望对你有一定的参考价值。

这是我发现使用C ++ / CX时非常奇怪的事情。

给出以下:

ref class Duper : public Windows::UI::Xaml::Controls::Grid{
internal:
    Duper(){}
    virtual void doNothing() = 0;
public:
    virtual ~Duper(){}

};

ref class Sub : public Duper
{
internal:
    Sub(){}
    void doNothing()override{}
public:
    virtual ~Sub(){}
};

调用子类:

Sub^ test = ref new Sub();
test->doNothing();

按预期正常工作,但运行时:

Sub^ test = ref new Sub();
test->Width = 20;

你会得到与此类似的问候

Error   226 error LNK2001: unresolved external symbol "public: class Windows::UI::Xaml::Controls::Grid ^ __stdcall XSideView::__abi_CastToBase(void)" (?__abi_CastToBase@XSideView@@Q$AAGP$AAVGrid@Controls@Xaml@UI@Windows@@XZ)    D:OZSOURCE70OZReportViewerOZWRTViewerozrvplatform.lib(OZCViewerSideView.obj)   ozrv_dll

但是,您可以通过执行以下操作来调用CastToBase:

Grid^ base = dynamic_cast<Grid^>(test3);
base->Width = 30;

它会工作正常。

有人可以向我解释为什么会这样吗?有没有办法解决这个问题,除了每次使用这个类时显式转换为Grid类?虽然我没有费心去测试其他参考类,但我敢打赌他们会有类似的问题。

PS:这可能是一个错误,并已在更高版本中修复(我目前正在使用VS2013在Windows 8.1中开发)

PPS:CastToBase文档:https://docs.microsoft.com/en-us/cpp/windows/interfacetraits-casttobase-method

答案

WinRT没有抽象类的概念 - 这是一个C ++ - 主义。您可以使用接口(如果它是100%抽象),也可以在基类中实现方法:

virtual void doNothing() 
{
  throw ref new Platform::FailureException(L"Can't use Duper directly"); 
}

(或者恢复到dynamic_cast<>技巧)。

以上是关于使用从WinRT Grid Class派生的抽象类时,CastToBase是否解决了外部符号错误?的主要内容,如果未能解决你的问题,请参考以下文章

“从 PlaceSelectionListener 派生的匿名类”类必须声明为抽象或实现抽象方法

复制从抽象类派生的对象

Python(面向对象编程——2 继承派生组合抽象类)

C++ 抽象类 (abstract class)

如果从抽象类派生,则无法使用具体类指针调用函数

从具体类派生抽象模板类