Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何确保类没有虚拟方法?_C++_Shared Memory_Virtual Functions - Fatal编程技术网

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

C++ 如何确保类没有虚拟方法?,c++,shared-memory,virtual-functions,C++,Shared Memory,Virtual Functions,我有一个类,它的对象在共享内存中使用。因此,我必须确保它们没有虚拟方法(通过vtable调用时会使程序崩溃) 我想防止任何人在违反此要求的情况下意外添加虚拟方法。理想情况下,如果类包含虚拟方法,编译器甚至会拒绝编译该类 解决方案不一定要符合标准,只要能在苹果的gcc-4.2或MSVC上运行就足够了 我怎样才能做到这一点呢?嗯,我真的认为强制执行这一点没有意义,但你可以使用boost-type-traits 编辑:示例: #include <iostream> #include <

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

我想防止任何人在违反此要求的情况下意外添加虚拟方法。理想情况下,如果类包含虚拟方法,编译器甚至会拒绝编译该类

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


我怎样才能做到这一点呢?

嗯,我真的认为强制执行这一点没有意义,但你可以使用boost-type-traits

编辑:示例:

#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
// 
#包括
#包括
结构基
{

virtualvoidmymethod(){std::cout好吧,我真的认为强制执行这一点没有意义,但您可以使用boost-type-traits

编辑:示例:

#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
// 
#包括
#包括
结构基
{


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

在源代码管理中添加一条规则,拒绝包含“虚拟”一词的签入,向高级开发人员发送电子邮件,并扣减出价如果您创建了一个源模块,其中包含一个与禁止使用虚拟方法的类同名的类,并且该类包含一个虚拟方法,但没有其他名称与另一个类同名的方法,那么会发生什么?该类将创建哪些全局符号?我的期望是如果存在两个名称相同但没有任何共同点的类,则链接器可能不会发出嘎嘎声,但如果两个类都有vtable,则链接器可能会注册冲突。它是否真正注册冲突将取决于使用的名称损坏规则。

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

Err..只是永远不要使用
virtual
关键字?这并不是说虚拟方法是隐式的…@Justin K:可能有clas不在共享内存中的ses,对于这些ses,虚拟方法是可以使用的…@Billy:问题是“一个类”所以我认为它可以应用于这一个文件。@Justin K--这一点很好。问题是,你必须在头文件中这样做,这会给客户端带来痛苦。@Tobias:根据该类作者写的评论,该类被用于共享内存,因此不允许使用虚拟。呃..永远不要使用
virtual
关键字?虚拟方法并不是隐式的…@Justin K:可能有一些类不在共享内存中,虚拟方法是可以的…@Billy:问题是“一个类”所以我认为它可以应用于这一个文件。@Justin K——这一点很好。问题是,你必须在头文件中这样做,这会给客户端带来痛苦。@Tobias:根据该类作者写的评论,该类被用于共享内存,因此不允许使用虚拟。
是多态的还包括在C++ Tr1和C++ 0x++ 1中的iSpple多态性,-Epsion用于“没有意义的强制执行”。。我认为在可能的情况下强制约束是相当明智的,而且不需要太多的努力。这在原则上与任何其他静态断言都没有区别。我想知道
boost::interprocess::offset\u ptr
是否会/应该像这样约束其模板参数。@Steve:好的,对于这样的模板类来说是有意义的。但那就是这似乎不是OP想要的——他只是不想让一些随机的开发人员向类中添加虚拟方法。注释可以很好地做到这一点。听起来很有希望。我会看看。这正是我所希望的。我一点也不反对注释,顺便说一句,限制需要记录下来。我只是不明白为什么不也这么做Stk,注释已经被注意。<代码> ISSO多态性< /代码>也包含在C++ Tr1和C++ 0x+1中,用于ISSO多态性,-EpSelon用于“没有意义的强制执行”。。我认为在可能的情况下强制约束是相当明智的,而且不需要太多的努力。这在原则上与任何其他静态断言都没有区别。我想知道
boost::interprocess::offset\u ptr
是否会/应该像这样约束其模板参数。@Steve:好的,对于这样的模板类来说是有意义的。但那就是这似乎不是OP想要的——他只是不想让一些随机的开发人员向类中添加虚拟方法。注释可以很好地做到这一点。听起来很有希望。我会看看。这正是我所希望的。我一点也不反对注释,顺便说一句,限制需要记录下来。我只是不明白为什么不也这么做st表示注释已经被注意到。Lol——可以假设,虽然在同一个项目中,有一些具有虚拟方法的类不在共享内存中……我为那个可怜的混蛋感到遗憾,他不小心将这个词放在注释或标识符中。@Billy:可能吧,但如果你尝试用编译器来做的话,同样的问题会出现@T:“\”将防止标识符和“虚拟”问题。但是,如果我站在OP的立场上,我宁愿有一些误报,而不是误报。Lol——可以假设,尽管存在使用virtu的类