我有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();
}
,但沒有問題我做了什麼總是去父母的'秀'..
我該怎麼辦?
我有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();
}
,但沒有問題我做了什麼總是去父母的'秀'..
我該怎麼辦?
您必須使其在基類中爲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_ptr
或shared_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();
}
您需要將B的show()方法標記爲虛擬並覆蓋。 –
@MikeWoolf:你的意思是我應該爲'B :: show'寫'virtual'嗎?標準中的每個§10.3/ 1是沒有必要的,你可以忽略它。順便說一句,在派生類上重複它是一個很好的習慣,我將它作爲評論放在答案中。 – deepmax
確定'arr'有輸入'int'? – simonc