Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 继承方法,派生方法不调用基_C++_Inheritance_Polymorphism - Fatal编程技术网

C++ 继承方法,派生方法不调用基

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

我有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*
,而不是
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,这是不必要的,您可以省略它。顺便说一句,在派生类上重复它是一种很好的做法,我已经将它作为注释放在了答案中。