Я хочу сделать эквивалент следующее для инициализации элемента данных my_abc
(который я подозреваю, не будет работать):Как инициализировать, во время строительства, абстрактный элемент данных базового класса из производного экземпляра класса
class ABC { // abstract base class
public:
virtual ~ABC {};
}
class SomeClass {
public:
SomeClass(ABC& abc); // argument will actually be instance of derived class
private:
ABC my_abc; // needs to be set from constructor argument
}
SomeClass::SomeClass(ABC& abc) : my_abc(abc)
{...} // copy construct `my_abc` from argument
Я подозреваю, что это не сработает, если производный класс ABC
передан конструктору SomeClass
, потому что конструктор копирования производного класса не будет вызываться для инициализации члена my_abc
.
Правильно ли я? Если да, что мне делать?
Если 'ABC' действительно абстрактный, вы не можете иметь экземпляр-член' ABC my_abc; '. Что вы можете сделать, это использовать ссылку: 'ABC & my_abc;'. Если ваша копия не перейдет на простое 'ABC', это называется _splicing_. –
@ πάνταῥεῖ довольно уверен, что вы имели в виду [* нарезка *] (http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c) (разделить), а не * сращивание * (до собрать). = P – WhozCraig
@WhozCraig Ooops, да! _slicing_, конечно. –