Дайте Foo конструктор, который принимает параметр Base:
class Foo : public Base {
public:
explicit Foo(const Base &b) {
// do work to initialise Foo. You might want to include
Base::operator=(b);
// or you might not. Depends how Foo works, and what Base's
// constructors do.
}
};
Всякий раз, когда вы пишете конструктор с одним аргументом, вы должны подумать, хотите ли вы указать "явный".
«Явный» означает, что конструктор должен использоваться только там, где вы явно написали вызов конструктора или приведение. Если его там нет, то компилятор также «неявно» преобразует объекты Base в Foo, например, в следующей ситуации:
int doSomething(const Foo &f) {
return 23;
}
Base b;
doSomething(b); // doesn't compile
doSomething(static_cast<Foo>(b)); // does compile
Если вы удалите «явное», то doSomething(b)
скомпилирует и сделает то же самое, что и вторая строка - создаст временный объект Foo из b и передаст его doSomething.