2016-04-02 180 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

有一個名爲* contravariance *的概念,它允許派生類改變方法的參數(不是任意的),但這不適用於此。您可以使用*默認參數*:http://en.cppreference.com/w/cpp/language/default_arguments – mike

+0

您可以爲參數創建另一個類。 virtual void func(MyBaseParemeterClass *)= 0; – QuentinUK

回答

2

DerivedA1::func(string)隱藏Base::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 
};