2012-11-07 158 views
1

Possible Duplicate:
it is possible to change return type when override a virtual function in C++?C++不同的返回類型重寫功能比基類

我得到錯誤:

error: conflicting return type specified for âvirtual bool D::Show() 
7: error: overriding âvirtual void A::Show()" 

當我編譯我的代碼。代碼是:

class A 
{ 
     public: 
     virtual void Show() 
     { 
     std::cout<<"\n Class A Show\n"; 
     } 
}; 

class B : public A 
{ 
    public: 
    void Show(int i) 
    { 
      std::cout<<"\n Class B Show\n"; 
    } 
}; 

class C 
{ 
    public: 
    virtual bool Show()=0; 
}; 

class D :public C, public B 
{ 
    public: 
     bool Show(){ 
      std::cout<<"\n child Show\n"; 
      return true;} 
}; 

int main() 
{ 
    D d; 
    d.Show(); 
    return 0; 
} 

我想使用類C中的Show()函數。我的錯誤在哪裏?

+0

http://stackoverflow.com/a/4222307/1231073 – sgarizvi

回答

6

您的編譯器正在抱怨,因爲這兩個函數沒有相同的返回類型:其中一個返回void,另一個返回bool。你的兩個函數應該有相同的返回類型

你應該有

class A { 
    public: 
    virtual bool Show() { 
     std::cout<<"\n Class A Show\n"; 
     return true; // You then ignore this return value 
    } 
}; 

class B : public A { 
    public: 
    bool Show(int i) { 
     std::cout<<"\n Class B Show\n"; 
     return true; // You then ignore this return value 
    } 
}; 

如果你不能改變類AB,你可以改變類CDvoid Show()方法,而不是bool Show()方法。

如果你不能做這些事情,你可以使用composition over inheritance:有B類型的成員你D函數中,而不是從它繼承:

class D : public C { 
public: 
    bool Show() { 
     std::cout<<"\n child Show\n"; 
     return true; 
    } 
    void ShowB() { 
     b.Show(); 
    } 

private: 
    B b; 
}; 
+0

不,我不能改變的函數的返回類型...我使用這段代碼,我想在我的子類中使用類C的顯示函數。 – user1805418

+0

您可以嘗試組合:在D函數中有一個類型爲'B'的成員,而不是從' B' – alestanis

+0

嗯那是什麼即時思考..任何方式非常感謝您的快速幫助.. :) – user1805418

1

您需要添加一箇中間人。 喜歡的東西:

class C1 : public C{ 
public: 
    virtual bool show(){ /* magic goes here */ } 
}; 

class D: public C1, public B{ 
.... 

要調用查看,你需要這樣的: static_cast<C&>(c).Show();