我正在使用最新版本的Xcode(写作时为9.4.1)构建一个C++框架,并从Objective-C++代码中使用它,同样在Xcode中。我需要执行一个
在Debug和Release模式下,我期望这段代码输出“True”,但实际上,在Release模式下会输出“False”。作为一项冒烟测试,
我在GitHub上上传了一个示例项目在这里。记得在Release模式下编译它,以查看我的问题原因。我包括了Objective-C++的
dynamic_cast
,将一个指针类型转换为另一个指针类型。然而,在Debug构建中dynamic_cast
正常工作,但在Release构建中不起作用。是否有什么我没有注意到或者理解错了,导致这个示例失败了?
C++框架
TestClass.hpp
class Parent {
public:
// https://dev59.com/_moy5IYBdhLWcg3wkOwK#8470002
// must have at least 1 virtual function for RTTI
virtual ~Parent();
Parent() {}
};
class Child : public Parent {
public:
// if you put the implementation for this func
// in the header, everything works.
static Child* createRawPtr();
};
TestClass.cpp
#include "TestClass.hpp"
Parent::~Parent() {}
Child* Child::createRawPtr() {
return new Child;
}
Objective-C++ 命令行应用程序
main.mm
#import <Foundation/Foundation.h>
#import <TestCastCPP/TestClass.hpp>
int main(int argc, const char * argv[]) {
@autoreleasepool {
Parent *parentPtr = Child::createRawPtr();
Child *child = dynamic_cast<Child*>(parentPtr);
NSLog(@"Was the cast successful? %s", child != nullptr ? "True" : "False");
}
return 0;
}
在Debug和Release模式下,我期望这段代码输出“True”,但实际上,在Release模式下会输出“False”。作为一项冒烟测试,
dynamic_cast
在这个SO帖子中可以正常工作。
有趣的是,同样的代码在C++命令行应用程序中也能正常工作,同样是在Xcode中。我尝试在Release模式下禁用优化器,但这似乎并没有解决问题。我在GitHub上上传了一个示例项目在这里。记得在Release模式下编译它,以查看我的问题原因。我包括了Objective-C++的
TestCast
方案和直接C++的TestCastCPP
方案。
override
,实现与Parent析构函数一样),它起作用了!(编辑:我看到了你关于RTTI的编辑。嗯。) - Deadpikle