这是我发现使用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:\OZSOURCE70\OZReportViewer\OZWRTViewer\ozrv\platform.lib(OZCViewerSideView.obj) ozrv_dll
但是,您可以通过执行以下操作来避免调用CastToBase:
Grid^ base = dynamic_cast<Grid^>(test3);
base->Width = 30;
而且它会工作得很好。
有没有人能给我解释一下为什么会这样?除了每次使用Grid类时显式转换为Grid类之外,还有什么方法可以解决这个问题吗?虽然我没有费心去测试其他的ref类,但我打赌它们也会有类似的问题。
PS:这可能是一个bug,并在以后的版本中得到了修复(我目前正在使用VS2013在Windows8.1中开发)
PPS: CastToBase文档:https://docs.microsoft.com/en-us/cpp/windows/interfacetraits-casttobase-method
转载请注明出处:http://www.hhy777.com/article/20230526/2500245.html