2014-12-20 3 views
0

У меня есть два класса Foo и Bar с избыточными членами. Мне нужен FooBar третьего класса, который содержит члены обоих типов, которые я могу передать в функции, ожидающие любого типа (возможно, с литой) и не иметь двух копий всего, что плавает.Наследование C++, члены и избыточные данные

class Foo{ 
public: 
    A a; 
    B b; 
    C c; 
}; 

class Bar{ 
    A a; 
    B b; 
    D d; 
}; 

class FooBar{ 
    A a; 
    B b; 
    C c; 
    D d; 
}; 

В C++ есть в любом случае сделать это без изменения кода, который использует А или В (или в лучшем случае изменения типов, которые ожидает код) и без лишних копий или сохранения избыточных данных? Простое наследование поддерживает повторяющиеся данные. Наличие общего базового класса и виртуального наследования компилируется под clang, но, похоже, не работает.

+0

Как насчет использования союза? – Pradhan

+0

Если вы хотите передать 'FooBar' функциям, которые ожидают' Foo' или 'Bar', вам понадобится использовать наследование. – Cornstalks

+0

Я думаю, что дизайн испорчен. Классы должны моделировать поведение, а не только данные. – Jens

ответ

4

Компилятор не знает, что Foo::a и Bar::a относятся к тому же. Это может быть логически верно в вашей программе, но это, безусловно, не применяется нигде в коде.

Если они на самом деле означает то же самое, вы можете иметь общую базу:

class AB { 
public: 
    A a; 
    B b; 
}; 

И использовать виртуальное наследование везде еще:

class Foo : public virtual AB { 
public: 
    C c; 
}; 

class Bar : public virtual AB { 
public: 
    D d; 
}; 

class FooBar : public Foo, public Bar { 

}; 

Таким образом, есть только один FooBar::a.

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