2016-04-02 4 views
1

Если у меня есть класс сказатьC++ - Параметры чистой виртуальной функции

class Base { 
public: 
    virtual void func() = 0; 
}; 

Это является основой для двух других классов

class DerivedA1 : public Base { 
public: 
    virtual bool func(string command); 
}; 

class DerivedB1 : public Base { 
public: 
    virtual void func(); 
} 

class DerivedA2 : public DerivedA1 { 
public: 
    bool func(string command);  //This one implements it differently 
};         //its base class. 

Разрешены выше? Я объявил func() без параметров, но затем я использую его с параметрами. У меня аналогичная ситуация в моем коде, что я не могу опубликовать, потому что это его часть школьного задания, и я получаю сообщение об ошибке, подобное

error: no matching function for call to Base::fucn(std::string&) 
note: candidate is: virtual bool Base::move(); 
note: candidate expects 0 arguments, provided 1 

Я хочу FUNC(), который будет использоваться по-разному в разных ее производные классы. Как я могу исправить эту проблему?

+0

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

+0

Существует концепция, называемая * контравариантность *, которая позволяет производному классу изменять аргумент метода (но не произвольно), но здесь это не применимо. Вы можете использовать * аргументы по умолчанию *: http://en.cppreference.com/w/cpp/language/default_arguments – mike

+0

Вы можете сделать еще один класс для параметра. virtual void func (MyBaseParemeterClass *) = 0; – QuentinUK

ответ

2

DerivedA1::func(string) является hidingBase::func(). Это разрешено, но не будет отменять поведение Base::func. лязг предупредит вас об этом, потому что это почти всегда ошибка

class DerivedA1 : public Base { 
public: 
    virtual bool func(string command); 
}; 

Это нормально:

class DerivedB1 : public Base { 
public: 
    virtual void func(); 
} 

Это переопределение DerivedA1::func(string). Виртуальная функция, которая существует только на интерфейсе DervivedA1 или что-то, полученное от него. Он не существует на Base

class DerivedA2 : public DerivedA1 { 
public: 
    bool func(string command);  //This one implements it differently 
};     
Смежные вопросы