C++ 强制VC++;按声明方法的顺序发出vtable

C++ 强制VC++;按声明方法的顺序发出vtable,c++,visual-c++,C++,Visual C++,下面是一个例子: struct I { virtual void method() = 0; virtual void method( const char* something ) = 0; }; class C : public I { void method() override { printf( "void" ); } void method( const char* something ) override {

下面是一个例子:

struct I
{
    virtual void method() = 0;
    virtual void method( const char* something ) = 0;
};

class C : public I
{
    void method() override
    {
        printf( "void" );
    }
    void method( const char* something ) override
    {
        printf( "string" );
    }
};
vtable顺序在
I
中翻转,带字符串参数的方法在不带参数的方法之前

这仅适用于具有相同名称的方法


有没有编译器开关可以防止编译器对我的方法重新排序,即使它们具有相同的名称?

答案很可能是“否!”请参阅讨论(尤其是Naveen的)。AdrianMole如果编译器随机对它们重新排序,COM将不可能实现,但人们已经使用COM几十年了。这里有更多的上下文:这个问题只发生在使用VC++的Windows上,并且只发生在具有相同名称的方法上。编译器不会随机对它们重新排序。他们根据特定于每个编译器(或正在使用的ABI,可能由多个编译器使用)的标准系统地对它们进行排序。否则,使用一个编译器编译的代码无法一致链接,COM已经无法工作。答案很可能是“不!”请参阅讨论(尤其是Naveen的)。AdrianMole如果编译器随机重新排序,COM将不可能,但人们使用COM已经几十年了。这里有更多的上下文:这个问题只发生在使用VC++的Windows上,并且只发生在具有相同名称的方法上。编译器不会随机对它们重新排序。他们根据特定于每个编译器(或正在使用的ABI,可能由多个编译器使用)的标准系统地对它们进行排序。否则,使用一个编译器编译的代码无法一致地链接,COM已经无法工作。