LINUX.ORG.RU

История изменений

Исправление eao197, (текущая версия) :

Задача: У Вас есть внешняя либа(не ваших рук дело) в которой есть не ваш класс A c функцией g, которую вам надо вызывать.

Да уж, просто мастер-класс в постановке задачи. Снимаю шляпу.

Про темплейты забудьте, на замусоревайте вопрос.

Ах да, вы же не осилили. Ну ладно, тогда ниже обойдемся просто чистым ООП.

и в общем случае(кроме особо экзотических) никаких других вариантов, у вас нет.

А просто создать локальную переменную типа A и вызвать у нее метод g не вариант? Ведь вашей «задаче» вполне соответствует.

В общем, если вы не умеете в шаблоны, то давайте для вас на базе ООП.

Если B наследуется от A, значит имеет место быть отношение is-a. Следовательно экземпляр B может быть передан куда-то, где ждут A.

Например:

struct A {
  virtual void g() { ... }; // Раз уж мы про наследование реализации,
    // то пусть будет тело прямо в A.
  ...
};

void call_g(A & a) { a.g(); }

Это значит, что у класса B должен быть метод g, причем не абы какой, а именно что от класса A. Отсюда и вылазииит множественное наследование: https://godbolt.org/z/r964hdaeM И у нас «плывет» значение this.

Если же мы не хотим имееть множественное наследование реализации, но подсунуть B в call_g хочется, то остается пойти по пути «интерфейсов» и агрегации, на котором нам и потребуется g в B: https://godbolt.org/z/ev715nWE4 И здесь у нас что в B::f(), что в B::g(), this один и тот же.

///— вы же просто вызывали функции с одним именем!!!, но совершенно разной семантикой(у них разные контексты) - из разных классов, чтобы что-то там проиллюстрировать. :))

А вы сейчас трезвы вообще?

Исходная версия eao197, :

Задача: У Вас есть внешняя либа(не ваших рук дело) в которой есть не ваш класс A c функцией g, которую вам надо вызывать.

Да уж, просто мастер-класс в постановке задачи. Снимаю шляпу.

Про темплейты забудьте, на замусоревайте вопрос.

Ах да, вы же не осилили. Ну ладно, тогда ниже обойдемся просто чистым ООП.

и в общем случае(кроме особо экзотических) никаких других вариантов, у вас нет.

А просто создать локальную переменную типа A и вызвать у нее метод g не вариант? Ведь вашей «задаче» вполне соответствует.

В общем, если вы не умеете в шаблоны, то давайте для вас на базе ООП.

Если B наследуется от A, значит имеет место быть отношение is-a. Следовательно экземпляр B может быть передан куда-то, где ждут A.

Например:

struct A {
  virtual void g() { ... }; // Раз уж мы про наследование реализации,
    // то пусть будет тело прямо в A.
  ...
};

void call_g(A & a) { a.g(); }

Это значит, что у класса B должен быть метод g, причем не абы какой, а именно что от класса. Отсюда и вылазииит множественное наследование: https://godbolt.org/z/r964hdaeM И у нас «плывет» значение this.

Если же мы не хотим имееть множественное наследование реализации, но подсунуть B в call_g хочется, то остается пойти по пути «интерфейсов» и агрегации, на котором нам и потребуется g в B: https://godbolt.org/z/ev715nWE4 И здесь у нас что в B::f(), что в B::g(), this один и тот же.

///— вы же просто вызывали функции с одним именем!!!, но совершенно разной семантикой(у них разные контексты) - из разных классов, чтобы что-то там проиллюстрировать. :))

А вы сейчас трезвы вообще?