派生类的地图

时间:2016-04-30 11:15:17

标签: c++ inheritance dictionary polymorphism

我有一个基类

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))

但是如何在不使用指针的情况下实现它?

2 个答案:

答案 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)

您的原始设计最终会无限递归。你需要一个多态映射,但是你需要它成为类的成员吗?

看一下这个问题Can a c++ class include itself as an attribute?