提问者:小点点

C++如何调用子类函数


我想使用派生类b::display()c::display(),但它使用的是a::display()。 如何更改代码,以便调用派生类“display()”来显示id名称
提前感谢:)

#include <iostream>
#include <vector>

using namespace std;

class A
{
protected :
    int id;
public:
    A ( int id = 0 ) : id(id) {}
    virtual void display() { cout << id << endl; }

};

class B : public A
{
    string name;
public:
    B ( int id = 0, string name = "-" ) : A(id), name(name) {}
    void display() { cout << id << " " << name << endl; }
};

class C : public A
{
    string name;
public:
    C ( int id = 0, string name = "-" ) : A(id), name(name) {}
    void display() { cout << id << " " << name << endl; }
};

int main()
{
    vector< vector <A> > aa;
    vector<A> bb ;
    vector<A> cc ;

    A *yy = new B(111, "Patrick");
    A *zz = new C(222, "Peter");
    bb.push_back(*yy);
    cc.push_back(*zz);

    aa.push_back(bb);
    aa.push_back(cc);

    for ( int i = 0; i < aa[0].size(); i++)
    {
        aa[0][i].display();
        aa[1][i].display();
    }
}

共3个答案

匿名用户

你的问题在于你的向量声明是非指针类型的,在运行时你失去了指向子类的“点”,而你只是停留在超类上。 您所要做的就是将所有向量更改为指针类型,如下所示:

vector<A*> bb;

匿名用户

您不能期望多态性在没有指针的情况下工作。 将主部件更改为

vector< vector <A*> > aa;
vector<A*> bb;
vector<A*> cc;

A* yy = new B(111, "Patrick");
A* zz = new C(222, "Peter");
bb.push_back(yy);
cc.push_back(zz);

aa.push_back(bb);
aa.push_back(cc);

for (int i = 0; i < aa[0].size(); i++)
{
    aa[0][i]->display();
    aa[1][i]->display();
}