C++如何调用子类函数

标签 c++ polymorphism subclass superclass

我想使用派生类 B::display()C::display(),但它使用 A::display() 。如何更改代码以便我可以调用派生类的 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();
    }
}

最佳答案

你的问题是你声明的 vector 是非指针类型的,并且在运行时你正在失去子类的“点”而你只是留在父类(super class)中。 您所要做的就是将所有 vector 更改为指针类型,如下所示:

vector<A*> bb;

关于C++如何调用子类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41190196/

相关文章:

c++ - OpenCL 的问题(opencl.dll、AMD APP SDK、cl.h)

c++ - 使用 file.seekp 的问题

Java 为什么我不能在函数式接口(interface)中使用多重继承

javascript - 流的信息丢失是否与这种多态性固有的结构子类型有关?

python - 与父类(super class)同名的子类变量

用于列出所有可能的模板实现的 C++ 解决方法

swift - 何时在 swift 中使用三种不同形式的关键字 "as"

c++ - 从文件中读取第 n 个元素

c++ - 如何使用 sscanf_s() 解析字符串?

c# - 在 C# 中使用 'new' 修饰符