Позволят ли неиспользуемые частные виртуальные методы в будущем расширение без нарушения совместимости 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?

Ответы на вопрос(3)

Ваш ответ на вопрос