Создайте экземпляр производного класса из экземпляра базового класса, не зная участников класса

Этот сценарий даже возможен?

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 должно быть equeal к pBase-> someBaseMember и похожий с другими основными участниками.

5
задан Aoi Karasu 26 February 2010 в 21:22
поделиться

3 ответа

Почему бы вам на самом деле не закончить написание и компиляцию кода?

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
}; 

Это компилируется и запускается, как вы указали.

EDIT: Или вы имеете в виду, что someNonBaseMemer должен быть равен someBaseMemer?

3
ответ дан 14 December 2019 в 04:36
поделиться

Зачем вам одновременно извлекать и передавать базовый указатель? Выберите одно из них, ничто не мешает вам иметь и то, и другое. Используйте наследование, чтобы сделать всю работу за вас:

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

Хотя это не лучший выбор для дизайна.

4
ответ дан 14 December 2019 в 04:36
поделиться

Объявить someBaseMemr общедоступным или изменить объявление с class на struct :

class Base
{
  public:
  int someBaseMemer;
};

OR

struct Base
{
  int someBaseMemr;
};

Помните, что класс по умолчанию имеет частный доступ ко всем членам и методам. Структура по умолчанию предоставляет общедоступный доступ.

Кроме того, все производные классы должны иметь общедоступное наследование от Base .

1
ответ дан 14 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: