我有一个类,它的对象在共享内存中使用。因此,我必须确保它们没有虚方法(当通过vtable调用时会使程序崩溃)。我想防止任何人不小心添加了一个虚方法而违反了这一要求。理想情况下,编译器甚至会拒绝编译包含虚方法的类。解决方案不一定需要符合标准,只要它们能在Apple的gcc-4.2或MSVC上工作就足够了。我怎样才能做到这一点?
8e2ybdfx1#
好吧,我真的认为这没有意义,但你可以从C++11开始使用boost类型traits的is_polymorphic或std::is_polymorphic。编辑:示例:
is_polymorphic
std::is_polymorphic
#include <iostream> #include <boost/type_traits.hpp> struct Base { virtual void MyMethod() { std::cout << "My method called."; } virtual ~Base() {} }; class Derived : Base { virtual void MyMethod() { std::cout << "Derived"; } }; struct POD { int data; }; int main() { std::cout << boost::is_polymorphic<Base>::value << std::endl; std::cout << boost::is_polymorphic<Derived>::value << std::endl; std::cout << boost::is_polymorphic<POD>::value << std::endl; } //Output is // 1 // 1 // 0 //
dly7yett2#
在源代码管理中添加一条规则,拒绝包含“虚拟”一词的签入,向高级开发人员发送电子邮件,并扣除违规方的报酬。
vs3odd8k3#
如果你创建了一个源模块,它包含一个类,这个类的名字和虚方法被禁止的那个类的名字相同,这个类包含一个虚方法,但是没有其他方法的名字隐藏了其他类的名字,会发生什么?这个类会创建什么全局符号?我的期望是,如果两个同名的类存在,但是没有任何共同点,链接器可能不会应答,但是如果两个类都有一个vtable,链接器可能会注册一个冲突。2它是否会注册一个冲突将取决于使用的名称修改规则。
3条答案
按热度按时间8e2ybdfx1#
好吧,我真的认为这没有意义,但你可以从C++11开始使用boost类型traits的
is_polymorphic
或std::is_polymorphic
。编辑:示例:
dly7yett2#
在源代码管理中添加一条规则,拒绝包含“虚拟”一词的签入,向高级开发人员发送电子邮件,并扣除违规方的报酬。
vs3odd8k3#
如果你创建了一个源模块,它包含一个类,这个类的名字和虚方法被禁止的那个类的名字相同,这个类包含一个虚方法,但是没有其他方法的名字隐藏了其他类的名字,会发生什么?这个类会创建什么全局符号?我的期望是,如果两个同名的类存在,但是没有任何共同点,链接器可能不会应答,但是如果两个类都有一个vtable,链接器可能会注册一个冲突。2它是否会注册一个冲突将取决于使用的名称修改规则。