0

У меня возникли проблемы с многократным случаем использования наследования (это не мой проект, я не решил схему наследования, извините). Во всяком случае, я не могу назвать защищенную функцию-член 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 общественности, я до сих пор вижу это. Что не так?

+2

Работы в MSVC. Какой компилятор вы используете? Похоже, он считает, что 'AB :: foo()' не является членом 'AB', дважды проверьте, что подпись идентична в вашей не упрощенной версии. – VoidStar

+0

Intel ICPC 14.0 – kc9jud

+0

Да, компилируется в MSVC! Пожалуйста, укажите компилятор, версию и любые флагов компилятора (если вы используете их). – zeropoint

ответ

0

Конкретный объект может быть *this, поэтому this->A::foo() и this->B::foo().

0

Я не определял свою функцию в правильном пространстве имен. void foo() и void AB::foo() очень разные!

 Смежные вопросы

  • Нет связанных вопросов^_^