Множественое наследование от абстрактного и обычного классов
От: RedCatX  
Дата: 06.11.10 14:44
Оценка:
Есть два абстрактных класса, и один унаследован от другого, например:

class CAbstractBaseClass1 {
public:
    virtual void print() const = 0;
    virtual void init() const = 0;
};

class CAbstractBaseClass2: public CAbstractBaseClass1 {
public:
    virtual int getVersion() const = 0;
};


И есть обычный класс CWorkingClass унаследованный от первого абстрактного класса:

class CWorkingClass: public CAbstractBaseClass1 
{
public:
    virtual void print() const { cout << "Print" << endl; }
    virtual void init() const { cout << "Inizialization..." << endl; }
};


Задача состоит в том, чтобы создать класс который будет реализовывать функции определенные во втором абстрактном классе
virtual int getVersion() const;

и в то же время будет предоставлять доступ к функциям первого абстрактного класса, реализованным в CWorkingClass.

То есть по идее должно быть что то вроде:
class CWorkingClass2: public CAbstractBaseClass2,
                         public CWorkingClass
                       
{
public:
    virtual int getVersion() const { return 4; }
};


и должны работать преобразования
CWorkingClass *working = new CWorkingClass2();
CAbstractBaseClass1 *b1 = dynamic_cast<CAbstractBaseClass1*>(working);
CAbstractBaseClass2 *b2 = dynamic_cast<CAbstractBaseClass2*>(working);


Но проблема в том что компилятор не определяет, что методы CAbstractBaseClass1 были переопределены в классе CWorkingClass, и считает что CWorkingClass2 тоже является абстрактным, и следовательно не позволяет его создать.

Пожалуйста, подскажите как решить данную проблему
Re: Множественое наследование от абстрактного и обычного кла
От: Muxa  
Дата: 06.11.10 14:51
Оценка:
почему в заголовке топика некоторые люди обозначают не вопрос "как решить проблему", а рассказ "как я создал себе проблему"?
Re: Множественое наследование от абстрактного и обычного кла
От: bober_maniac Россия http://bober-maniac.livejournal.com/
Дата: 06.11.10 15:04
Оценка:
Здравствуйте, RedCatX, Вы писали:

RCX>Но проблема в том что компилятор не определяет, что методы CAbstractBaseClass1 были переопределены в классе CWorkingClass, и считает что CWorkingClass2 тоже является абстрактным, и следовательно не позволяет его создать.


RCX>Пожалуйста, подскажите как решить данную проблему


В вашем случае, насколько я понимаю, проблема решается виртуальным наследованием. У вас создается два параллельных дерева базовых классов и в результате два раза наследуется корневой базовый класс. Унаследовав его виртуально, можно избежать проблемы.
Re: Множественое наследование от абстрактного и обычного кла
От: derProgrammer Россия  
Дата: 06.11.10 15:36
Оценка: +1
Здравствуйте, RedCatX, Вы писали:

RCX>Есть два абстрактных класса, и один унаследован от другого, например:


RCX>
class CAbstractBaseClass1 {
RCX>public:
RCX>    virtual void print() const = 0;
RCX>    virtual void init() const = 0;
RCX>};

RCX>class CAbstractBaseClass2: public CAbstractBaseClass1 {
RCX>public:
RCX>    virtual int getVersion() const = 0;
RCX>};


RCX>И есть обычный класс CWorkingClass унаследованный от первого абстрактного класса:


RCX>
class CWorkingClass: public CAbstractBaseClass1 
RCX>{
RCX>};


RCX>Задача состоит в том, чтобы создать класс который будет реализовывать функции определенные во втором абстрактном классе

RCX>
virtual int getVersion() const;

RCX>и в то же время будет предоставлять доступ к функциям первого абстрактного класса, реализованным в CWorkingClass.

RCX>То есть по идее должно быть что то вроде:

RCX>
class CWorkingClass2: public CAbstractBaseClass2,
RCX>                         public CWorkingClass
                       
RCX>{
RCX>};


RCX>Но проблема в том что компилятор не определяет, что методы CAbstractBaseClass1 были переопределены в классе CWorkingClass, и считает что CWorkingClass2 тоже является абстрактным, и следовательно не позволяет его создать.


RCX>Пожалуйста, подскажите как решить данную проблему


Так ли необходимо наследовать CAbstractBaseClass2 от CAbstractBaseClass1? Насколько я могу видеть, это типичный mix-in, и не нужно в этом случае усложнять себе жизнь.
Re: Множественое наследование от абстрактного и обычного кла
От: RedCatX  
Дата: 06.11.10 22:14
Оценка:
Применил виртуальное наследование. Большое спасибо всем за ответы
Re[2]: Множественое наследование от абстрактного и обычного
От: Erop Россия  
Дата: 08.11.10 08:04
Оценка:
Здравствуйте, derProgrammer, Вы писали:

P>Так ли необходимо наследовать CAbstractBaseClass2 от CAbstractBaseClass1? Насколько я могу видеть, это типичный mix-in, и не нужно в этом случае усложнять себе жизнь.


Тем более, что в CAbstractBaseClass2 можно добавить метод GetCAbstractBaseClass1, если уж очень так надо...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Множественое наследование от абстрактного и обычного
От: Erop Россия  
Дата: 08.11.10 08:05
Оценка:
Здравствуйте, RedCatX, Вы писали:

RCX>Применил виртуальное наследование. Большое спасибо всем за ответы


Виртуальное наследование -- это штука зело небесплатная. Не забудь проверить, что оверхед всё ещё приемлем!..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.