C++ 继承方法,派生方法不调用基
我有A类和B类,例如,这是代码C++ 继承方法,派生方法不调用基,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,我有A类和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(); } 在这种情况下,我想让B班的表演付诸行动,但不管我做了什么,它总是去看家长的“表演” 我能做什么?您必须在基类中将其设置为虚拟方法,并且在您的情况下,数组应为a*,而不是in
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();
}
在这种情况下,我想让B班的表演付诸行动,但不管我做了什么,它总是去看家长的“表演”
我能做什么?您必须在基类中将其设置为
虚拟
方法,并且在您的情况下,数组应为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\u ptr
或shared\u 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();
}
结构A
{
虚拟void show(){};
};
结构B:公共A
{
void show(){}
/*虚拟void show()重写{}*/
};
int main()
{
唯一的_ptr arr[2];
arr[0]。重置(新A);
arr[1]。重置(新B);
arr[1]->show();
}
你确定
arr
有类型int
?你想把B的show()方法标记为virtual并重写。@mikewolf:你的意思是我也应该为B::show
写virtual
?根据标准§10.3/1,这是不必要的,您可以省略它。顺便说一句,在派生类上重复它是一种很好的做法,我已经将它作为注释放在了答案中。