У меня возникли проблемы с многократным случаем использования наследования (это не мой проект, я не решил схему наследования, извините). Во всяком случае, я не могу назвать защищенную функцию-член virtual
функцией переопределения. Вот упрощенная структура класса:Вызов переопределенных функций в C++ с множественным наследованием
class Base {
protected:
virtual void foo() { }
};
class A: virtual public Base {
protected:
virtual void foo();
};
void A::foo() { printf("Hello A\n"); }
class B: virtual public Base {
protected:
virtual void foo();
};
void B::foo() { printf("Hello B\n"); }
class AB: public A, public B {
protected:
void foo();
};
void AB::foo()
{
A::foo();
B::foo();
}
Я бы ожидать, что если я буду называть AB
«s foo()
, я получу вывод, который выглядит как
Hello A
Hello B
Однако, когда я компилирую, я получаю ошибки как:
error #308: function "A::foo" is inaccessible
A::foo();
^
error: a nonstatic member reference must be relative to a specific object
A::foo();
^
error #308: function "B::foo" is inaccessible
B::foo();
^
error: a nonstatic member reference must be relative to a specific object
B::foo();
^
Даже если я все из foo
s общественности, я до сих пор вижу это. Что не так?
Работы в MSVC. Какой компилятор вы используете? Похоже, он считает, что 'AB :: foo()' не является членом 'AB', дважды проверьте, что подпись идентична в вашей не упрощенной версии. – VoidStar
Intel ICPC 14.0 – kc9jud
Да, компилируется в MSVC! Пожалуйста, укажите компилятор, версию и любые флагов компилятора (если вы используете их). – zeropoint