This problem can be solved using interfaces. C ++ now knows no interfaces, but you can easily do something similar with abstract base classes:
class Base { ... }
class A : public Base { ... }
class B : public Base { ... }
...
Base *X;
if (some_condition)
X = new A();
else
X = new B();
, , X.
( - Base, , , , # Java. , , , .. ++, . , .)