2015-12-03 28 views
0

如果我是做一個基類:功能攝入繼承X類的對象

 class Father 
    { 
     public: 
     void doSomething(); 
    }; 

,然後如果我做這些類:

 class Daughter : public Father 
    { 

    }; 
    class Son : public Father 
    { 

    }; 

我能有一個功能該引入口的對象,並執行其doSomething()

 void function(const &Father thing) 
    { 
     thing.doSomething 
    } 
    int main() 
    { 
     Son son(); 
     Daughter daughter(); 
     function(son); 
     function(daughter); 
    } 
+0

是的。事實上,除了「函數」的刪節之外,這裏的所有東西都可以工作。什麼是問題? –

回答

0

是的,你可以,因爲doSomehing()SonDaughter繼承。但是Father::doSomething()將被執行。如果標記Father::doSomething()virtual,然後覆蓋它DaughterSon,那麼你實現運行時多態性,即「正確」的功能是基於實例的類型調用。例如:

#include <iostream> 

class Father 
{ 
public: 
    virtual void doSomething() const {std::cout << "Father\n";} 
    virtual ~Father() = default; 
}; 

class Daughter : public Father 
{ 
    void doSomething() const override {std::cout << "Daughter\n";} 
}; 

class Son : public Father 
{ 
    void doSomething() const override {std::cout << "Son\n";} 
}; 

void function(const Father& thing) 
{ 
    thing.doSomething(); 
} 

int main() 
{ 
    Son son; 
    Daughter daughter; 
    function(son); 
    function(daughter); 
} 

Live on Coliru

注意:你有很多錯別字的在你的代碼。更嚴重的錯誤是,你doSomething()沒有標記const,因此你將無法從const引用調用它。