C++如何调用子类函数
C++ How to call a subclass function
我想使用派生的 class B::display()
和 C::display()
,但它使用 A::display()
。如何更改代码以便我可以调用派生的 class' display()
来显示 id
和 name
?
提前致谢:)
#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 对象位置的数据成员。
你不能期望多态性在没有指针的情况下也能工作。
将您的主要部分更改为
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();
}
我想使用派生的 class B::display()
和 C::display()
,但它使用 A::display()
。如何更改代码以便我可以调用派生的 class' display()
来显示 id
和 name
?
提前致谢:)
#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 对象位置的数据成员。
你不能期望多态性在没有指针的情况下也能工作。 将您的主要部分更改为
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();
}