История изменений
Исправление 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 один и тот же.
///— вы же просто вызывали функции с одним именем!!!, но совершенно разной семантикой(у них разные контексты) - из разных классов, чтобы что-то там проиллюстрировать. :))
А вы сейчас трезвы вообще?