2014-09-24 59 views
-2

你好,我是新來的C + +和學習從基類指針轉換爲派生類指針。瞭解基地派生的轉換

class Base{ 
public: 
    virtual void method(){ 
     std::cout << "this is a base class" << std::endl; 
    } 
}; 

class Derived:public Base{ 
public: 
    virtual void method(){ 
     std::cout << "this is a derived class" << std::endl; 
    } 
}; 


int main(){ 
    Base *a = new Base(); 
    Derived *b = new Derived(); 
    a = b 
    a->method() 

    Base c; 
    Derived d; 
    c=d; 
    c.method() 

    return 0; 
} 

A->()的方法將打印 「這是一個派生類」

c.method()將打印 「這是一個基類」,」

如何理解不同行爲呢?我有點明白a = b基本上讓編譯器知道a是一個Base類指針指向Derived類,所以多態性會在這裏工作。但到底是什麼c=d代碼嗎?

我正在使用Xcode ..

在此先感謝!

+5

您的代碼不會按照提供的方式進行編譯。 'c'和'd' **之後的'()'不能在你的真實代碼中出現。至於'c = d;',請查看「對象切片」。 – Angew 2014-09-24 14:44:46

+2

根據@ Angew的評論請參閱[這裏](http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c)。 – 2014-09-24 14:48:03

+1

當你像這樣使用多態時,90%的時間你必須使用指針或對象的引用。智能指針最好,自然。 – 2014-09-24 14:49:38

回答

2

c = d行所做的就是所謂的切片 - 它需要的d並將其複製到c底座部分,割掉派生類的所有屬性。這包括在派生類中定義的任何虛函數。

如果你想要多態性,你必須使用指針或引用

+0

謝謝馬克。我真的不擅長將我指定的問題與C++中現有的着名魔術詞聯繫起來......'slicing'解決了我的問題! – cgao 2014-09-24 15:11:05

+0

@Mahone很高興我能幫忙!有時在這個行業中,術語是最難的部分......當你知道使用哪些單詞時,Google會創造奇蹟。 – 2014-09-24 15:24:10