使用从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是否解决了外部符号错误?的主要内容,如果未能解决你的问题,请参考以下文章