Вы в безопасности.
Порядок, в котором методы появляются в vftable
, определяется структурой базового класса, и это все, что вам нужно.Но это зависит от компилятора, поэтому используйте тот же компилятор для генерации DLL.Не полагайтесь на их обратную совместимость (или хотя бы проверяйте документацию).
Предположим, у вас есть следующий заголовок:
//header.h
class A
{
public:
virtual void foo() = 0;
virtual void goo() = 0;
};
И у вас есть B.dll
со следующимкласс:
class B : public A
{
public:
virtual void foo() {}
virtual void goo() {}
}
Теперь в X.dll
вы получаете указатель на A
, который является B
объектом, созданным в B.dll
.
Вызов
void test( A* a )
{
a->foo();
}
вызовет B::foo()
.
Один изящный эксперимент, который вы можете попробовать, - это скомпилировать B.dll
с помощью header.h
, а когда вы скомпилируете X.dll
, инвертировать порядок методов вheader.h
:
//header.h
class A
{
public:
virtual void goo() = 0;
virtual void foo() = 0;
};
В этом случае, хотя вы никогда не должны делать этого, тот же вызов test()
в X.dll
, вероятно, вызовет метод B::goo()
.Это потому, что X.dll
предполагает наличие vftable
в заголовке.Это неопределенное поведение, хотя;Я просто написал этот пример, чтобы сделать точку.