Я очень новичок в C++ и пытаюсь найти хороший образец для того, чтобы иметь следующее:
Это кажется разумным и как я могу хранить объекты, подобные этим из разных классов? Я надеялся просто определить переменную как BaseClass myCurrentObject;
а затем сделайте что-то вроде myCurrentObject = ChildClassA();
или myCurrentObject = ChildClassB();
и т.д., но, похоже, это не так просто!
То, что вы описываете, - это именно полиморфизм, так что да, это разумно.
Как было предложено в комментариях, вы должны использовать указатели для ссылки на объекты, как в
BaseClass* obj = new ChildClassA();
obj->call_some_virtual_function();
// ^ Will call the most derived definition of the function
Конечно, если вы пишете какую-либо серьезную программу, вы не должны использовать простые указатели здесь. Они просто делают слишком вероятным, что вы рано или поздно забудете удалить старый объект, на который указывает obj
прежде чем назначать ему новый. Но так как вы сказали, что новичок в C++, и, возможно, просто захотите попробовать, вышесказанное может быть прекрасным.
Причина, почему это не может быть так просто, как просто написать BaseClass obj = ChildClassA();
что это означает, что obj
является объектом типа BaseClass
. Но так как ChildClassA
может иметь больше членов, чем BaseClass
, вы не можете хранить ChildClassA
в месте, предназначенном только для объекта BaseClass
. Таким образом, вы должны понимать, что для полиморфизма требуется переменный объем памяти, и вы можете попасть только в кучу.
delete obj;
прежде чем указывать на новый объект, я должен быть хорошим, верно?
obj
на новый действительный объект, прежде чем использовать его снова. Так что, как правило, кроме как в начале и в конце программы, вы всегда должны delete obj; obj = new Whatever()
как пара, а не только один.
BaseClass *myCurrentObject = new ChildClassA;
или лучшеstd::unique_ptr<BaseClass> myCurrentObject (new ChildClassA);
для большей безопасности (если у вас есть c ++ 11).