В C ++ нет никаких оснований для того, чтобы конструкторы когда-либо были виртуальными, потому что они являются статическими функциями. Это означает, что они статически связаны, поэтому вам нужно идентифицировать саму функцию конструктора, которую вы вызываете, чтобы вызвать ее вообще. В этом нет никакой неопределенности и ничего виртуального.
Это также означает, что, несмотря ни на что, вам нужно знать, каким будет ваш объект. Однако то, что вы можете сделать, выглядит примерно так:
Superclass *object = NULL;
if (condition) {
object = new Subclass1();
}
else {
object = new Subclass2();
}
object.setMeUp(args);
... иметь виртуальную функцию и вызывать ее после конструирования. Это стандартный шаблон в Objective-C, в котором сначала вы вызываете метод alloc для класса, чтобы получить экземпляр, а затем вызываете initilializer, который подходит вам.
Человек, который упомянул шаблон Abstract Factory, вероятно, более корректен для C ++ и Java.