Ваши последние примеры не будут разрешены, поскольку вы запрашиваете указатели, но вместо этого попробуйте предоставить локальные временные объекты.
std::vector<Ask*> ui ={
new AskString{"Enter your name: ", 3, 25},
new AskString{"Enter your city: ", 2, 25},
new Ask{"Enter your age: "}
};
Это было бы разрешено, и не было бы никакой двусмысленности типа.
Это тоже было бы правильно:
std::vector<Ask*> ui ={
new AskString("Enter your name: ", 3, 25),
new AskString("Enter your city: ", 2, 25),
new Ask("Enter your age: ")
};
А ваш пример больше похож на:
std::vector<Ask> ui ={ // not pointers
{"Enter your name: "},
{"Enter your city: "},
{"Enter your age: "}
};
std::vector<AskString> uiString ={ // not pointers
{"Enter your name: ", 3, 25},
{"Enter your city: ", 2, 25},
{"Enter your age: ", 7, 42}
};
и снова не будет никакой двусмысленности в типах.