ОК, поэтому первое легко:
XmlableA::XmlableA(int foo) : A(foo)
{
}
Второе требует выполнения чего-то вроде
XmlableA(string xmlfilename) : A(fooFromXML(xmlfilename))
{
}
, которое мы можем реализовать как
class XmlableA : public A
{
static int fooFromXML(string filename);
public:
// ...
Обратите внимание, что fooFromXML
, который загружает файл XML и возвращает нужное вам целое число, должен быть статическим, потому что когда мы его вызываем, у нас еще нет экземпляра XmlableA
для его вызова.
Для нескольких аргументов (и в качестве общего дизайна), фабрика, вероятно, лучше всего: если вы привязаны к модели конструктора и не заботитесь об эффективности, вы можете сделать:
class XmlableA : public A
{
static int intFromXML(char const *varname, string const &filename);
public:
XmlableA(string const &xmlfilename)
: A(intFromXML("foo", xmlfilename), intFromXML("bar", xmlfilename))
{
}
Если вы беспокоитесь о повторном анализе XML-файла и не заботитесь о повторном входе, вы можете «запомнить» xFromXML
, поместив его в состояние кэширования в статическом члене.