我有一个基类
class Person{
public:
Person(string name , int age ){
this -> name = name;
this -> age = age;
}
virtual void getInfo(){
cout << "Person " << name << " " << age;
}
void add(string name , const Person & b){
a[name] = b
}
protected:
string name;
int age;
map<string , Person > a;
};
包含对象类型Person的地图。我想将各种派生类推送到该映射中,例如
派生类
class Kid : public Person{
public:
Kid(string name, int age):Person(name,age){};
virtual void getInfo( ){
cout << "Kid " << name << " " << age;
}
};
我想要Person类的add
方法,如
Person one("John",25);
one.add("Suzie",15);
哪个失败了。我知道我可以使用指针重新编写代码,例如
map<string , Person*> a
void add( string name , Person *b){
a[name] = b;
}
Person one("John",25);
one.add(new Kid("Suzie",15))
但是如何在不使用指针的情况下实现它?
答案 0 :(得分:3)
不,如果不使用引用或指针,就无法获得多态性。
通过认为非指针对象需要存储整个类数据(包括vtable),可以很容易地理解这个问题。
这意味着LinearLayout ly = (LinearLayout)_view.findViewById(R.id.ringtone_layout_retry);
findViewById(R.id.progressBar1).setVisibility(View.GONE);
ly.setVisibility(View.VISIBLE);
会将某个map<string, person>
个实例存储在person
广告位中。
但sizeof(person)
无法包含足够的数据来存储sizeof(person)
子类的其他信息。这会导致object slicing。
答案 1 :(得分:0)
您的原始设计最终会无限递归。你需要一个多态映射,但是你需要它成为类的成员吗?