2016-12-16 38 views
1

我想使用派生类B::display()C::display(),但它使用A::display()。如何更改代码,以便我可以调用派生类'display()以显示id以及name
感谢提前:)C++如何调用子类函数

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

你的问题,他是你没有保存在向量中的指针。如果你将这个向量改为:vector 它会起作用。 –

+0

我认为当我声明它在超类中是虚拟的时,子类的函数会自动变为虚拟的? – Jess

+0

是的,你是对的我没有注意到你的超类显示是虚拟的。我编辑了我的第一条评论。 –

回答

2

你的问题了,你是矢量的declartion非指针类型的,并且运行时,你失去了“点”子类,你只留在超级类。 所有你所要做的就是您所有的向量更改为指针类型,这样的:

vector<A*> bb; 
+0

@Jess,这就是所谓的切片。当你推回并存储指针而不是对象本身时,只要摆脱'*'即可。 – Collin

+0

@Daniel Kovachev感谢您的帮助!我设法解决这个问题:) – Jess

+0

欢迎您:) –

1

的这里的问题是为了继承工作,你需要使用指针。您的向量是vector<A>而不是vector<A*>,因此,当您推回yy和zz的解除引用版本时,您将推送A数据成员的副本,而不是B和C数据成员的副本。 B和C的大小与A不同,所以它只会做一个适合A对象的数据成员的副本。

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

+0

@Jess目前唯一可以考虑的附加链接是:https://www.tutorialspoint.com/cplusplus/cpp_inheritance.htm – Eddge

+0

好的,谢谢您! – Jess

0

你不能指望多态性没有指针的工作。 改变你的主要部分为

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