2010-07-09 6 views
1

Это функции и объявления Struct, которые у меня есть, и мне не разрешено их изменять.Как добавить новых членов в Struct

DerivedA giveDerivedA(); 
DerivedB giveDerivedB(); 

struct Base{ 
    QString elementId; 
    QString elementType; 
}; 

struct DerivedA : Base { 
    int a; 
    int b; 
}; 

struct DerivedB : Base { 
    int c; 
    int d; 
}; 

Но что мне нужно что-то вроде этого:

struct DerivedA : Base { 
    int a; 
    int b; 
    void create(); 
    QString doc; 
}; 

Как я могу добавить эти методы и члена структур я получил?

Моя первая идея состоит в том:

struct myA: DerivedA { 
    void create(); 
    QString doc; 
}; 

Есть ли у вас какие-либо предложения?

Edit: вторая альтернатива (Choosed)

struct myA{ 
    void create(); 
    QString doc; 
    private: 
     DerivedA derivedA; 
}; 
+0

Почему они должны быть частными? Это будет означать, что больше ничего не может получить к ним. –

+0

И почему вы не можете их изменить? – GManNickG

+0

@Marcelo Cantos, извините, нет, частный, мой плохой, я редактировал. – metdos

ответ

2

Это похоже на проблему, когда люди расширяют стандартные классы библиотек. Если ваш базовый класс не имеет виртуального деструктора, вы не можете надежно унаследовать его. В этом случае вы должны либо использовать свободные функции (предпочтительно в любом случае), либо композицию.

В противном случае у вас есть хорошо.

+0

Базовый класс не имеет виртуального конструктора, в чем проблема с наследованием в таком случае? – metdos

+2

@metdos: Если у вас есть: 'struct base {}; struct output: base {}; 'Then:' base * x = new производный; 'становится неопределенным поведением с' delete x; '. Если вы удаляете производный тип с помощью базового указателя, базовый тип должен иметь виртуальный деструктор. Вот почему вы не можете наследовать (большинство) стандартных классов библиотеки. – GManNickG

+0

Спасибо, я вижу сейчас. – metdos

0

Это не работает, это как вы это делаете.

1

Использование композиции или наследования в зависимости от того, какие отношения имеют классы (см., Например, пункты 32 и 38 в «Эффективном C++»).

+0

Спасибо, мне понравилось "is-реализован-in-terms-of". – metdos

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