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已经无法工作。