Как типизировать и создать объект во время выполнения в cpp? - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу сначала создать объект родительского класса и в соответствии с некоторым условием создать дочерний объект дочернего класса и поместить его в родительский объект.Теперь, после передачи объекта в какую-либо функцию, этой функции необходимо получить доступ к методу дочернего класса.Пожалуйста, смотрите код для уточнения.

class Parent {
    virtual f(){
        print('Parent');
    }
}

class Child: public Parent{
    virtual f(){
        print('Child')
    }
}

void do_something(Parent &obj){
    obj.f(); // this will print Child
}

int main(){

    Parent obj;
    if(cond){
        // This is my actual question
        // Not sure how to create a child obj here and put it into parent obj
        Child obj = dynamic_cast<Child>(obj);
    }   

    do_something(obj) // pass the child obj
}

1 Ответ

0 голосов
/ 06 февраля 2019
  1. Используйте указатель вместо объекта.

    Parent* ptr = nullptr;
    if(cond){
        ptr = new Child();
    }
    
    if ( ptr )
    {
       do_something(*ptr) // pass the child obj
    }
    
  2. Измените do_something, чтобы использовать ссылку, а не объект.Когда аргумент передается по значению объекта, программа сталкивается с проблемой objct-slicing .

    void do_something(Parent& obj){
      ....
    }
    
  3. Изменение do_something на вызов f() на пройденном объекте.

    void do_something(Parent& obj){
      obj.f();
    }
    
...