Неоднозначность вызова функции множественного наследования С++

У меня есть основной вопрос, связанный с множественным наследованием в C++. Если у меня есть код, как показано ниже:

struct base1 {
   void start() { cout << "Inside base1"; }
};

struct base2 {
   void start() { cout << "Inside base2"; }
};

struct derived : base1, base2 { };

int main() {
  derived a;
  a.start();
}

что дает следующую ошибку компиляции:

1>c:\mytest.cpp(41): error C2385: ambiguous access of 'start'
1>      could be the 'start' in base 'base1'
1>      or could be the 'start' in base 'base2'

Нет ли возможности вызвать функцию start() из определенного базового класса, используя объект производного класса?

Я не знаю варианта использования прямо сейчас, но .. все же!


person goldenmean    schedule 27.07.2011    source источник
comment
Я сократил фрагмент. Семантика не изменилась.   -  person Lightness Races in Orbit    schedule 27.07.2011
comment
Аналогично stackoverflow.com/questions /4831759/   -  person Ioan Paul Pirau    schedule 27.07.2011
comment
Переименуйте функции start1 и start2.   -  person QuentinUK    schedule 27.07.2011
comment
@JohnPaul не то же самое; это о двух базовых классах с одинаковой функцией, это о двух базовых классах, которые имеют функцию с одинаковым именем, но разными аргументами.   -  person dascandy    schedule 28.07.2011


Ответы (3)


a.base1::start();

a.base2::start();

или если вы хотите использовать его специально

class derived:public base1,public base2
{
public:
    using base1::start;
};
person dascandy    schedule 27.07.2011
comment
ты спас мой день! спасибо за упоминание части с using ..! - person bricklore; 11.11.2014

Конечно!

a.base1::start();

or

a.base2::start();
person Lightness Races in Orbit    schedule 27.07.2011
comment
Пытаюсь понять - если бы наследование было виртуальным, не было бы двусмысленности. Как так? - person goldenmean; 27.07.2011
comment
@goldenmean: это уже давно не было частью моего ответа. - person Lightness Races in Orbit; 27.07.2011

В дополнение к ответам выше, если мы имеем дело с НЕВИРТУАЛЬНЫМ наследованием:

ты сможешь:

  1. используйте 1_

or

  1. переопределить start() в производном

Кстати, обратите внимание на проблему с бриллиантами, которая может возникнуть. В этом случае вы можете использовать виртуальный.

person user3742309    schedule 12.01.2021