2017-01-09 28 views
-1

我看到這個例子初始化的對象: http://www.cplusplus.com/doc/tutorial/typecasting/#dynamic_cast用不同類

(...) 
class Base { virtual void dummy() {} }; 
class Derived: public Base { int a; }; 
(...) 
Base * pba = new Derived; 
Base * pbb = new Base; 
(...) 

爲什麼「PBA」爲基本對象,如果它正在與衍生初始化?爲什麼不把它作爲派生對象?

Derived * pba = new Derived; // use this instead 

而且它只是一個C++的東西嗎?

+2

這是*多態*的一個實例。你不能指望我們提供一個完全詳細的答案,因爲這是一個相當廣泛的主題(我相信這裏有一些重複)。 – Downvoter

+0

這是dynamic_cast的一個例子。如果你寫 _derived * PBA =新的派生; _ 那麼這行沒有任何意義 _pd = dynamic_cast的(PBA); _ –

+1

如果你同時擁有[一組貓,狗](HTTPS://en.wikipedia .org/wiki/Polymorphism_%28computer_science%29%23Subtyping),並且想讓這個集合中的所有動物發出聲音,然後你爲每個動物調用'Animal :: talk()',但這個調用會產生不同的結果,關於動物的實際分類。 – Dialecticus

回答

1

既不pba也不pbb是一個對象,但它們是類型基類Base的指針,以便在您的代碼使用他指針多態,這意味着一個基指針可以指向相同的類或它的派生類對象。

  • 該目的是利用新的未PBB創建或PBA本身,可以考慮下面的例子:

    #include <string> 
    #include <iostream> 
    using namespace std; 
    
    
    class Base 
    { 
        public: 
         virtual void Print() const { cout << "Base print()" << endl;} // virtual function 
         void Greet()const {cout << "in Base Say: hello!" << endl;} 
    }; 
    
    class Derived : public Base 
    { 
        public: 
         void Print() const { cout << "Derived print()" << endl;} // ovrode the base member pritn() 
         void Greet()const {cout << "in Derived Say: hello!" << endl;} 
    }; 
    
    int main() 
    { 
    
        Base* pba = new Derived; 
    
        pba->Print(); // Derived print() 
        pba->Greet(); // in Base Say: hello! ??? because Greet() is not virtual 
    
        Base* pbb = new Base; 
    
        pbb->Print(); // Base print() 
        pbb->Greet(); // in Base Say: hello! 
    
        return 0; 
    } 
    

    所以在運行時指針PBA和PBB可以由此所分配的基礎的目的或派生的類虛擬成員函數被相應地調用。