代码之家  ›  专栏  ›  技术社区  ›  Tobias

如何确保类没有虚方法?

  •  1
  • Tobias  · 技术社区  · 14 年前

    我有一个类,它的对象在共享内存中使用。因此,我必须确保它们没有虚拟方法(通过vtable调用时会使程序崩溃)。

    我想防止任何人意外地添加了一个虚拟方法,违反了这一要求。理想情况下,编译器甚至会拒绝编译包含虚拟方法的类。

    解决方案不一定要符合标准,只要能在苹果的gcc-4.2或MSVC上运行就足够了。

    我怎样才能做到这一点?

    3 回复  |  直到 11 年前
        1
  •  9
  •   Billy ONeal IS4    14 年前

    好吧,我真的认为这是没有意义的强制执行,但你可以使用增强型特征 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
    // 
    
        2
  •  1
  •   Bill    14 年前

        3
  •  -1
  •   supercat    14 年前

    如果您创建了一个源模块,其中包含一个与禁止使用虚拟方法的类同名的类,并且该类包含一个虚拟方法,但没有其他名称与另一个类同名的方法,会发生什么情况?该类将创建哪些全局符号?我的预期是,如果存在两个同名的类,但没有任何共同点,链接器可能不会发出嘎嘎声,但如果两个类都有vtable,链接器可能会注册冲突。它是否真的会注册冲突将取决于所使用的名称损坏规则。