2016-01-14 2 views
1

У меня есть абстрактный класс A и чисто виртуальная функция toDoOrNotToDo. У меня есть два подкласса: A1 и A2, так что A1 нуждается в параметре const int xtoDoOrNotToDo, чтобы выполнить свою работу, а A2 не нуждается в этом параметре для выполнения этой работы.Две функции переопределения той же чистой виртуальной функции с разными параметрами?

Но если я пишу

class A2 : public A { 
public: 
    int toDoOrNotToDo() const override; 
}; 

Это, очевидно, будет жаловаться:

'INT A2 :: toDoOrNotToDo() Const' отмечены переопределение, но не отменяет

I может просто написать:

class A { 
public: 
    virtual int toDoOrNotToDo(const int x) const = 0; 
    virtual ~A(); 
}; 

class A1 : public A { 
public: 
    int toDoOrNotToDo(const int) const override; 
}; 

class A2 : public A { 
public: 
    int toDoOrNotToDo(const int) const override; 
}; 

Но тогда в A2::toDoOrNotToDo У меня есть параметр, который мне не нужен.

Как я могу улучшить дизайн?

+1

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

ответ

4

Сначала определите интерфейс. Если параметр int не требуется для функции, то реализация не может потребовать его, не нарушая Liskov Substitution Principle.

Если это необходимо, просто введите его в класс интерфейса. Пока параметр документирован как «не может повлиять на результат», все хорошо.

Однако, все сидение выглядит плохой дизайн для меня — Возможно, абстракция действительно не действительна, и вы используете неправильный инструмент для работы?

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