Ваш код страдает от обрезки объектов . Даже если targetChild
в main
является TargetChild
, оно передается по значению в Caller::set_target
, что означает, что оно копируется в локальную переменную типа Target
. Чтобы обойти срезы объектов в целом, вы должны использовать передачу по ссылке или указатели.
В этом случае, поскольку вы хотите, чтобы Caller
получил доступ к переданному объекту вне метода Caller::set_target
, вам следует использовать указатель. Только ссылки не будут работать, потому что, хотя вы можете сделать ссылку Caller::target
, вы не можете изменить объект, на который она ссылается.
Указатели приводят к проблемам с управлением памятью, так как вы должны убедиться, что TargetChild
освобожден (в противном случае программа имеет утечку памяти), но не слишком скоро (что приведет к нарушениям доступа, скорее всего, к аварийному завершению вашей программы). В библиотеке boost есть различные классы smart pointer , чтобы упростить эту задачу. Класс C ++ auto_ptr
также может быть использован, если только один другой класс должен владеть экземпляром TargetChild
в любой момент времени.