2016-11-26 3 views
-1

У меня есть следующая программа, которая не компилируется:C++ множественное наследование - одни и те же методы в базовых классах, но с разными аргументами

class Interface1 
{ 
    virtual void f() = 0; 
}; 

class Interface2 
{ 
    virtual void f(int i) = 0; 
}; 

class Interface3 : public Interface1, 
        public Interface2 
{}; 

class C : public Interface3 
{ 
    virtual void f() {} 
    virtual void f(int i) {} 
}; 

int main() 
{ 
    Interface3* inter = new C(); 
    inter->f(); // Error 
} 

Что не так? Означает ли это, что не имеет значения, имеют ли методы разные типы аргументов?

ошибка: запрос члена 'F' неоднозначен
Примечание: кандидаты: виртуальная пустота Interface1 :: F()
...
примечание: виртуальная пустота Interface2 :: F (INT I)

+0

_Что такое? _ 'Введите код здесь'. Пожалуйста, исправьте свой вопрос. Спасибо. – skypjack

+0

При публикации вопросов о ошибках сборки всегда включайте фактическую ошибку в теле вопроса. Измените свой вопрос, включив в вопрос полный, полный и неотредактированный вывод ошибки (включая возможные информационные заметки). Затем также укажите, где находятся ошибки в коде, который вы показываете, например, комментарием. Пожалуйста, [прочитайте о том, как задавать хорошие вопросы] (http://stackoverflow.com/help/how-to-ask), и узнайте, как создать [Минимальный, Полный и Подтверждаемый пример] (http: // stackoverflow. ком/помощь/mcve). –

+0

Проблема заключается в объявлении 'class Interface3' (typo **' {}: '** вместо **' {}; '**). –

ответ

1

Проблема состоит в том, что два определения f в двух базовых типах не определены в одной области, поэтому они не перегружают. Есть две отдельные функции с именем f в Interface3 и нет правила выбирать один или другой.

+0

Но как я могу это исправить, если я хочу сохранить имена функций? – Dusan

+0

Решение: public: using Interface1 :: f; используя Interface2 :: f; в Interface3. – Dusan