Предполагая, что Bar
должно наследоваться от Foo
(чего нет в текущем примере), проблему, которую вы здесь видите, обычно называют проблема алмаза . Какую версию foo
вы хотите использовать, Bar::foo()
или Foo::foo()
? Вам нужно указать виртуальное наследование:
struct Foo{
~virtual Foo(){}
void foo(){}
};
struct Bar : virtual public Foo
struct Baz : virtual public Foo, public Bar
, чтобы сообщить ему, что должен существовать только один тип foo()
. Следовательно, виртуальное наследование используется для вызова вызова foo()
в конструкторе.
Edit:
И чтобы быть ясным, я предполагаю, что вы хотите, чтобы Bar
унаследовал от Foo
. Если в вашем коде этого нет, то это является причиной ошибки неверного приведения. Не существует иерархии наследования, которую Bar
должен пройти, чтобы добраться до Foo
. Кроме того, современные компиляторы не должны даже компилироваться без виртуального наследования, но некоторые унаследованные компиляторы с радостью это сделают.
И если я собираюсь комментировать другой ответ, мне лучше довести свой ответ до конца!