2012-02-14 2 views
0

У меня есть следующая проблема. Существует класс, Foo, а другой - Bar, который является членом класса Foo.наследует часть базового класса

class Bar{ 
private: 
    some stuff; 
public: 
    Bar(); 
    some other_stuff; 
}; 
class Foo{ 
private: 
    Bar bar; 
public: 
    Foo(); // Initialize the bar object here in the constructor 
    void doSomethingWithBar(); 
}; 

Теперь оба класса огромны! Для некоторых приложений мне необходимо внести изменения как в Foo, так и в Bar, и поэтому есть классы Foo_Derived и Bar_Derived.

class Bar_Derived: public Bar{ 
private: 
    some NEW_stuff; 
public: 
    Bar_Derived(); 
    some New_other_stuff; 
}; 
class Foo_Derived: public Foo{ 
private: 
    Bar_Derived bar; 
public: 
    Foo_Derived(); 
    void doSomethingWithBar(); 
}; 

Насколько я понимаю, наследование, когда Foo_Derived() называется базовый класс конструктор Foo также называется, который инициализирует объект бар в базовом классе (типа Bar. То, что я должен сделать так, чтобы бар вместо этого используется объект в производном классе? (типа Bar_Derived). Мне нужен только базовый класс (Foo), чтобы инициализировать базовую часть объекта штриховки и сделать остальное в классе Foo_Derived. Возможно ли это?

Извините, если вопрос непонятен. Я просто смутил себя!

+0

Невозможно наследовать часть класса. –

ответ

0

Инициализатор базового класса только инициализирует базовую часть объекта, так как это все, о чем он знает. Инициализатор класса должен инициализировать только те вещи, которые всегда необходимо инициализировать для всех членов этого класса.

В конструкторе для Foo_Derived вы можете использовать список инициализаторов, чтобы указать, какой конструктор Bar_Derived вызывать. Конструктор Bar_Derived может использовать любой конструктор Bar, который он пожелает. Если у вас нет конструктора Bar_Derived, который создает Foo_Derived::bar так, как вы этого хотите, вы должны написать или переосмыслить, как вы настроили свою иерархию.

+0

Спасибо. Я надеялся, что смогу избежать этого. Самое простое исправление заключается в том, чтобы добавить новый материал в Bar_base, но это не будет принадлежать и ошибочно, поскольку Foo ничего не знает о новом материале; только Foo_derived делает. Другой способ, которым я могу это исправить, заключается в том, что Foo и Bar являются членами Foo_derived и Bar_derived (которые больше не являются производными от Foo или Bar), таким образом я могу сделать «обертки», которые непосредственно вызывают соответствующие функции в базе класс при необходимости, добавляя некоторые новые вещи. – GradGuy

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