2016-09-17 5 views
-3

У меня есть эта проблема, что я не знаю, как правильно ее решить.C++ - дизайн ООП - множественное наследование и чистый виртуальный метод

class A : public B, public C 
{ 
    virtual void GetSomethingElse() 
    { 
    } 
} 

class B 
{ 
    public void GetSomething() 
    {  
     GetSomethingElse(); 
    } 

    virtual void GetSomethingElse() = 0; 
} 

class C 
{ 
    virtual void GetSomethingElse() = 0; 
} 

В принципе, то, что у меня есть два абстрактных классов B, C. Обычно мне просто нужно унаследовать один из них, но в некоторых случаях мне нужны оба.

Как правильно решить эту проблему с помощью метода GetSomethingElse(), который должен вызываться от B. Если я наследую только B, он будет реализован в дочернем. Если только от C, все еще в порядке. Однако, если я наследую B и C, у меня есть «странный» дизайн, который устраняет проблему наследования алмазов, но это совсем не то же самое.

+2

Я не вижу проблемы, наследующей от B и C. Какая у вас проблема, точно? –

+0

Можете ли вы предоставить код, который действительно порождает ошибку, которую вы хотите решить? – Galik

ответ

2

Как вы уже упоминали, это сильно отличается от проблемы с алмазами.

Ваш дизайн верный и не проложенный. Наличие GetSomeThingElse как чистого виртуального заключается в принуждении ребенка к его определению. Определение его, если оно связано с C или B, не является проблемой дизайна. У вас возникнет проблема с дизайном, если бы он был чистым виртуальным в одном и виртуальным в другом (B или C), поскольку один дает вам выбор, а другой - обязательством.

-1

Поскольку они являются абстрактными, вам необходимо перезаписать метод в class A. Каждый объект будет знать, является ли он B или C, поэтому он будет вызывать правильную функцию.

Если, однако, ваш класс C не имеет функции GetSomething(), то ваша структура наследования неверна - помните, что логика наследования заключается в том, что каждый объект производного класса тоже является объектом родительского класса? Поэтому, если A не является B, потому что у него нет такого вызова, что-то не так.

Еще один момент заключается в получении virtual, так что две идентичные функции считаются одинаковыми: class A : virtual public B, virtual public C

вы считаете ли сделать класс, который является родителем B и C? Если у них нет общего родителя, почему у них есть функция с одинаковым именем?

0
class A : public B, public C 
{ 
    virtual void GetSomethingElse() 
    { 
    } 
} 

class B:public class D 
{ 
    public void GetSomething() 
    {  
     GetSomethingElse(); 
    } 

    virtual void GetSomethingElse() 
    { 
    } 
} 

class C:public class D 
{ 
    virtual void GetSomethingElse() 
    { 
    } 
} 

//here's the only pure virtual base class 
class D 
{ 
    virtual void GetSomethingElse() = 0; 
} 
Смежные вопросы