2013-11-02 74 views
0

我有A類和B類,比如這是在這種情況下,我想B到動作類展會的代碼繼承方法,派生方法調用不是基本

class A{ 
void show(){.....}} 

class B:public A{ 
void show(){....}} 

void main() 
{ int arr[2]; 
arr[0]=new A(); 
arr[1]=new B(); 
arr[1]->show(); 
} 

,但沒有問題我做了什麼總是去父母的'秀'..

我該怎麼辦?

+0

確定'arr'有輸入'int'? – simonc

回答

1

您必須使其在基類中爲virtual方法,並且在您的情況下數組應爲A*而不是int。那麼這兩個點可以解決你的問題:

struct A 
{ 
    virtual void show() {} 
    //^^^^^^^ 
}; 

struct B : public A 
{ 
    void show() {} 
    /* virtual void show() override {} */ 
}; 

int main() 
{ 
    A *arr[2]; 
    arr[0] = new A; 
    arr[1] = new B; 

    arr[1]->show(); 
} 

最後一個字,避免裸露的指針,你可以使用智能指針如unique_ptrshared_ptr

struct A 
{ 
    virtual void show() {}; 
}; 

struct B : public A 
{ 
    void show() {} 
    /* virtual void show() override {} */ 
}; 

int main() 
{ 
    unique_ptr<A> arr[2]; 

    arr[0].reset(new A); 
    arr[1].reset(new B); 

    arr[1]->show(); 
} 
+0

您需要將B的show()方法標記爲虛擬並覆蓋。 –

+0

@MikeWoolf:你的意思是我應該爲'B :: show'寫'virtual'嗎?標準中的每個§10.3/ 1是沒有必要的,你可以忽略它。順便說一句,在派生類上重複它是一個很好的習慣,我將它作爲評論放在答案中。 – deepmax