2013-02-23 91 views
2
struct struct1 
{}; 
struct struct2:public struct1 
{}; 
class Base 
{ 
public: 
    virtual void foo(struct1 *s) 
    { 
     cout<<"foo in Base"<<endl; 
    } 
}; 
class Der:public Base 
{ 
public: 
    virtual void foo(struct2 *s) 
    { 
     cout<<"Foo in Der"<<endl; 
    } 
}; 
int main() 
{ 
    struct2 s; 
    Base *b = new Der(); 
    b->foo(&s); 
} 

當我在main調用函數時它調用Base中的成員,打印出「Base中的foo」。當Derived類函數採用struct1指針時,它在Der中打印「foo」。但是,有什麼辦法讓它走struct2指針,並顯示「富在明鏡」覆蓋繼承結構的函數

回答

3

你問的是什麼,解釋你的意思是覆蓋Base::foo的行爲,將共同變異函數的自變量,而這在OO中是不可能的,因爲派生類型會縮小基本類型的契約,因此它會打破Liskov替代原則。您將無法將類型爲Base的對象替換爲類型爲Der的對象,因爲後者不接受不是struct2對象的struct1對象。

當派生類型函數具有相同的簽名(即還需要struct1*),那麼它覆蓋Base和動態調度踢的行爲。但是,當你的簽名具有struct2*它不覆蓋而是隱藏Base功能。

+0

由於Der中的成員函數foo使用不能接受struct1指針的struct2指針,Liskov替換原則失敗了嗎? – sajas 2013-02-23 09:11:30

+0

@sajas:是的,LSP要求你應該能夠用派生類型替換對基的任何使用。在這種情況下,無法完成,因爲基類的使用(尤其是調用具有不是'struct2'的struct1'對象的'foo')不適用於派生類型,因此,你不能用派生類型替換基類。 – 2013-02-24 03:37:32