Я разработал свои классы, как показано ниже .. Я пытаюсь получить доступ к unordered_map производного класса из указателя базового класса, указывающего на экземпляр производного класса ... Я знаю, что не могу этого сделать из-за нарезки объектов ...
Я знаю, что могу получить доступ к производной карте классов после static_casting / dynamic_casting .... -> Мне не интересен этот подход.
Но я ищу подход в форме создания абстрактного базового классасодержит одну чисто виртуальную функцию и определяет ее в производном классе, чтобы она возвращала указатель на свою карту ...
Я пытался использовать концепцию static_cast и dynamic_cast. Это работает, но я не хочу делать так.
Мой код:
class Base{
public:
Base(string key, string type){
this->key = key;
this->key_Type = type;
}
protected:
string key;
string key_Type;
};
class Derived : public Base{
public:
Derived(string k, string t) : Base(k,t){}
protected:
unordered_map<string, Base*> my_Map;
};
int main(){
Derived *d1 = new Derived("Id","Integer");
Base* b = d1;
Derived *d2 = new Derived("Name","String");
b->my_Map.insert({"Name",d2});
return 0;
}
Мой ожидаемый результат, так или иначе, мне нужен доступ к этой производной карте классов, чтобы я мог вставить в нее значения, например:
my_Map.insert({"Name",PointerobjectofDerivedclass})
РЕДАКТИРОВАТЬ:1 -----------------------------
Я пытался использовать чисто виртуальные функции, но мне не очень понятнокак это использовать .. Так что я закончил с большим количеством ошибок ..
Мой код:
класс Base {
public:
Base(string key, string type){
this->key = key;
this->key_Type = type;
}
virtual void insertmap()=0;
protected:
string key;
string key_Type;
};
класс Производные: общедоступная база {
public:
Derived(string k, string t) : Base(k,t){}
virtual void insertmap(string n , Base* obj){
this->my_Map.insert({n,obj});
}
protected:
unordered_map<string, Base*> my_Map;
};
int main () {
Derived *d1 = new Derived("Id","Integer");
Base* b = d1;
Derived *d2 = new Derived("Name","String");
b->insertmap("Name",d2);
return 0;
}
Ошибки моего компилятора: В функции 'int main ()': ошибка: недопустимое новое выражение абстрактного классаtype 'Derived' Derived * d1 = new Derived ("Id", "Integer");^ note: потому что следующие виртуальные функции являются чистыми внутри 'Derived': class Derived: public Base {^ note: virtual void Base :: insertmap () virtual void insertmap () = 0;^ ошибка: недопустимое новое выражение абстрактного типа класса «Производное» Производное d2 = новое Производное («Имя», «Строка»);^ ошибка: нет соответствующей функции для вызова 'Base :: insertmap (const char [5], Derived &)' b-> insertmap ("Name", d2);^ note: кандидат: note: virtual void Base :: insertmap () virtual void insertmap () = 0;^ примечание: кандидат ожидает 0 аргументов, 2 при условии