我有一个类,其对象在共享内存中使用。因此,我必须确保它们没有虚拟方法(通过vtable调用时会使程序崩溃)。
我想防止任何人意外添加违反此要求的虚拟方法。理想情况下,如果类包含虚方法,编译器将拒绝编译该类。
解决方案不一定需要符合标准,只要它们适用于Apple的gcc-4.2或MSVC就足够了。
我怎样才能做到这一点?
答案 0 :(得分:9)
嗯,我真的认为执行这个没有意义,但你可以使用提升类型特征'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
//
答案 1 :(得分:1)
向您的源代码管理添加规则,拒绝包含“虚拟”一词的签到,向高级开发人员发送电子邮件,并停止违规方的付款。
答案 2 :(得分:-1)
如果您创建的源模块包含一个与禁止使用虚拟方法的类同名的类,并且该类包含一个虚方法但没有其他方法的名称与另一个类的名称相同,会发生什么?该类创建的全局符号是什么?我的期望是,如果存在两个具有相同名称的类但没有任何共同点,则链接器可能不会发出尖叫声,但如果两个类都有vtable,则链接器可能会注册冲突。它是否真的会记录冲突将取决于使用的名称修改规则。