C++如何调用子类函数

C++ How to call a subclass function

我想使用派生的 class B::display()C::display(),但它使用 A::display()。如何更改代码以便我可以调用派生的 class' display() 来显示 idname?
提前致谢:)

#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();
    }
}

你的问题是你声明的向量是非指针类型,并且在运行时你正在将 "point" 丢失给 subclass 而你只是留在 super class。 您所要做的就是将所有向量更改为指针类型,如下所示:

vector<A*> bb;

这里的问题是为了让继承工作,你需要使用指针。你的向量是 vector<A> 而不是 vector<A*> 所以当你推回 yy 和 zz 的取消引用版本时,你推回了他们的 A 数据成员的副本而不是 B 和 C 数据的副本成员。 B 和 C 的大小与 A 不同,因此它只会复制适合 A 对象位置的数据成员。

http://www.learncpp.com/cpp-tutorial/125-the-virtual-table/

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

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();
}