2016-07-21 2 views
1

У меня есть случай, когда объект и коллекция объектов ведут себя одинаково. Таким образом, чтобы представлять объект У меня есть класс:Как использовать состав и наследование вместе?

class A { 
public: 
    virtual void foo(); 
protected: 
    int x; 
}; 

И представлять коллекцию объектов, у меня есть еще один класс:

class Collection: public A { 
    void foo(); //override base class function 
private: 
    vector<A*> aList; 
} 

Это хорошо, но проблема в том, что класс Collection будет иметь копию A :: x, которая мне не нужна. Я не хочу, чтобы класс Collection наследовал члены данных. Как мне это достичь?

Примечание: Я не могу редактировать «класс А», потому что это из библиотеки. Коррекция: я не могу изменить интерфейс A. A используется в остальной части кода. Я могу изменить реализацию. Я могу изменить A :: anyFunction() на виртуальный, если он уже не является виртуальным. Я могу изменить приватный член для защиты.

+0

' Коллекция :: x' и 'A :: x' - это тот же' x'. – LogicStuff

+0

Я понимаю это. Но я не хочу, чтобы этот член данных был в классе Collection. –

+0

Можете ли вы отредактировать функции, ожидающие полиморфного 'A'? – StoryTeller

ответ

1

Вы можете использовать интерфейс:

class AInterface { 
public: 
    virtual void foo() = 0; 
}; 

, а затем

class A : public AInterface { 
    /*...*/ 
}; 

class Collection : public AInterface { 
    /*...*/ 
}; 

Если вы наклоненная редактировать A вы могли использовать интерфейс, написав обертку:

class AWrapper : public AInterface { 
    void foo() { a.foo(); } 
private: 
    A a; 
}; 
+0

Я только что добавил примечание. Я не могу редактировать класс A. –

+0

@PramodT Я видел его и редактировал ответ – user463035818

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