Позволят ли неиспользуемые частные виртуальные методы в будущем расширение без нарушения совместимости ABI?
Я разрабатываю общую библиотеку. Допустим, у меня есть следующее определение класса:
class MyClass {
public:
//public interface
private:
virtual void foo1(int);
virtual void foo2(int, bool);
virtual void foo3(double);
virtual void reserved1();
virtual void reserved2();
virtual void reserved3();
class Impl;
Impl* impl_;
};
reserved#
Виртуальные методы не переопределяются в клиентском коде и нигде не вызываются. Они служат заполнителями для будущего расширения. Допустим, я заменил один из зарезервированных методов виртуальной функцией с другой сигнатурой и реализацией:
class MyClass {
public:
//public interface
private:
virtual void foo1(int);
virtual void foo2(int, bool);
virtual void foo3(double);
virtual void foo4(int, int);
virtual void reserved2();
virtual void reserved3();
class Impl;
Impl* impl_;
};
Казалось бы, таким образом достигается полная двоичная совместимость, поскольку компоновка vtable не меняется. Проблема в том, что старый код все равно будет запрашивать динамический компоновщикreserved1()
и если определение не находится в библиотеке, то код будет зависать во время соединения или во время выполнения, если кто-то вызываетfoo4
, Я предполагаю, что эта проблема не может быть решена из-за ODR. Может быть, есть способ обмануть компилятор для генерации символаreserved1
это будет действовать как псевдонимfoo4
?