2015-09-06 3 views
1

Предположим, у меня есть базовый класс с именем BaseClass и объект с именем Foo, который унаследован от BaseClass. Могу ли я скопировать всех членов экземпляра BaseClass в текущий создаваемый объект вместо того, чтобы делать это вручную?Скопировать всех членов класса в текущий объект

class BaseClass 
{ 
    int a; 
    int b; 
    int c; 
    const char *e; 
}; 

class Foo : BaseClass 
{ 
public: 

    Foo(BaseClass* bc, int x, const char *value) 
    { 
     // copy bc->a to this->a and bc->b to this->b 
     // and so on with all the members of BaseClass class 
     this->x = x; 
     this->s = value; 
    } 

    int x; 
    const char *s; 
}; 

Могу ли я это сделать? Другим возможным решением с memcpy(), не уверен, что это некрасиво или не может работать, но предполагая, что члены, выделенные в порядке с BaseClass первого, то есть, этот класс стал чем-то вроде памяти:

struct 
    { 
     // members of BaseClass 
     int a; 
     int b; 
     int c; 
     const char *e; 
     // members of Foo 
     int x; 
     const char *s; 
    }; 

Нечто подобное в Foo конструктор:

memcpy(this, &bc, sizeof(*bc)); 

Если скопировать все члены bc в текущем объекте, не так ли? это опасность?

Btw, я делаю это в стиле C. Я не делаю много C++. C++ - способ сделать это очень приветствуется.

+1

быть в курсе объектно-нарезку. Копирование и полиморфизм не всегда хороши, потому что вызываемый конструктор экземпляра определяется во время компиляции. Общим решением является создание метода виртуального клона, который каждый производный класс переопределяет по мере необходимости, чтобы возвращать правильный тип объекта. –

ответ

2

Изменить объявление конструктора Foo включить конструктор для базового класса:

Foo(BaseClass* bc, int x, const char *value): BaseClass(*bc) 
+0

Это легко? благодаря! – Jack

+0

'Foo f1, f2; BaseClass & b1 = f1, b2 = f2; b1 = b2; 'кричит! –

Смежные вопросы