2012-09-02 103 views
2

我想知道當你正在執行的對象存儲在類(而不是指針或引用類型)內時,C++中的多態是如何工作的。與類成員對象的多態性

我讀過多態性只會在指針和引用工作,但是我重載< <運營商,這將需要一個參考A.

在我的測試實現這個例子中,我發現它不能按預期工作,並將返回基類字符串(「A」)而不是「B」。

這是因爲對象存儲在類本身?並且運算符參與引用與多態的運作無關? (即因爲它的對象的核心是存儲在類,它不會工作,除非我把它保存在類的指針/參考) 感謝

class Test { 

    public: 
     void Run() { 
      object_ = B(); 
      std::cout << object_ << std::endl; 
     } 


    private: 
     A object_; 
}; 

Class A { 
    // Assume this is already implemented. All it does it add obj.getType() 
    // to stream 
    friend ostream& operator<<(ostream& stream, A obj); 

    public: 
     virtual std::string getType() { 
      return std::string("A"); 
     } 
}; 

Class B : public A { 
    public: 
     std::string getType() { 
      return std::string("B"); 
     } 
}; 

int main(int argc, char* argv[]) { 
    Test test = Test(); 
    test.Run(); 
} 
+0

重複:http://stackoverflow.com/questions/4403726/learning-c-polymorphism-and-slicing - 這被稱爲「切片」,與'object_'是一個類成員無關。 – Mat

+0

這就是我正在尋找的術語,歡呼 – Antix

回答

2

你在你們班有一個A對象,所以,當你這樣做:

object_ = B(); 

在RHS的B對象切片。見object slicing。這是獨立的是一個類的成員的對象,並且可以通過更簡單的例子來說明:

int main() 
{ 
    B b; 
    A a; 
    a = b; 
    std::cout << a << "\n"; 
} 
+0

所以,如果我要將A對象類型更改爲Test內的A *,它會在沒有切片的情況下工作? – Antix

+0

@Antix是的,它會的。 – juanchopanza

+0

真棒,我想我現在知道它是如何工作的。謝謝 – Antix