Создать экземпляр производного класса из экземпляра базового класса, не зная членов класса.
-
23-09-2019 - |
Вопрос
Возможен ли вообще такой сценарий?
class Base
{
int someBaseMemer;
};
template<class T>
class Derived : public T
{
int someNonBaseMemer;
Derived(T* baseInstance);
};
Цель:
Base* pBase = new Base();
pBase->someBaseMemer = 123; // Some value set
Derived<Base>* pDerived = new Derived<Base>(pBase);
Значение pDerived->someBaseMemer должно быть равно pBase->someBaseMember и аналогично другим базовым элементам.
Решение
Почему бы вам не закончить написание и компиляцию кода?
class Base
{
public: // add this
int someBaseMemer;
};
template<class T>
class Derived : public T
{
public: // add this
int someNonBaseMemer;
Derived(T* baseInstance)
: T(*baseInstance) // add this
{ return; } // add this
};
Это компилируется и запускается так, как вы указали.
РЕДАКТИРОВАТЬ:Или ты имеешь в виду это someNonBaseMemer
должно быть равно someBaseMemer
?
Другие советы
Зачем вам нужно одновременно получить и передать базовый указатель?Выбирайте любой вариант, ничто не мешает вам иметь и то, и другое.Используйте наследование, чтобы сделать всю работу за вас:
class Base
{
public:
Base(int x) : someBaseMemer(x) {}
protected: // at least, otherwise, derived can't access this member
int someBaseMemer;
};
template<class T>
class Derived : public T
{
int someNonBaseMemer;
public:
Derived(int x, int y) : someNonBaseMemer(y), T(x) {}
};
Derived<Base> d(42, 32); // usage
Хоть и не лучший выбор в плане дизайна.
Объявить someBaseMemr
как публичный или изменить декларацию с class
к struct
:
class Base
{
public:
int someBaseMemer;
};
OR
struct Base
{
int someBaseMemr;
};
Помните, что class
имеет private
доступ ко всем членам и методам по умолчанию.А struct
обеспечивает public
доступ по умолчанию.
Кроме того, все производные классы должны иметь public
наследство от Base
.