c++ 如何确保类没有虚方法?

qyzbxkaa  于 2023-04-01  发布在  其他
关注(0)|答案(3)|浏览(77)

我有一个类,它的对象在共享内存中使用。因此,我必须确保它们没有虚方法(当通过vtable调用时会使程序崩溃)。
我想防止任何人不小心添加了一个虚方法而违反了这一要求。理想情况下,编译器甚至会拒绝编译包含虚方法的类。
解决方案不一定需要符合标准,只要它们能在Apple的gcc-4.2或MSVC上工作就足够了。
我怎样才能做到这一点?

8e2ybdfx

8e2ybdfx1#

好吧,我真的认为这没有意义,但你可以从C++11开始使用boost类型traits的is_polymorphicstd::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
//
dly7yett

dly7yett2#

在源代码管理中添加一条规则,拒绝包含“虚拟”一词的签入,向高级开发人员发送电子邮件,并扣除违规方的报酬。

vs3odd8k

vs3odd8k3#

如果你创建了一个源模块,它包含一个类,这个类的名字和虚方法被禁止的那个类的名字相同,这个类包含一个虚方法,但是没有其他方法的名字隐藏了其他类的名字,会发生什么?这个类会创建什么全局符号?我的期望是,如果两个同名的类存在,但是没有任何共同点,链接器可能不会应答,但是如果两个类都有一个vtable,链接器可能会注册一个冲突。2它是否会注册一个冲突将取决于使用的名称修改规则。

相关问题