Използване на наследяване от конкретен клас за внедряване на чист виртуален метод C++

Искам да внедря чистите виртуални методи от интерфейс, използвайки имплементацията, предоставена от конкретен клас, без да се налага изрично да извиквам метода от конкретния клас. Пример:

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

class InterfaceB:public InterfaceA{  
public:  
   virtual void bar() = 0;  
};

class ConcreteA : public InterfaceA{  
public:  
   virtual void foo(){}//implements foo() from interface  
};

class ConcreteAB: public InterfaceB, public ConcreteA{  
public:  
    virtual void bar(){}//implements bar() from interface  
};

В този сценарий компилаторът иска имплементация на foo() в клас ConcreteAB, тъй като InterfaceB не го е имплементирал и е наследен от InterfaceA.

Има начин да кажете на компилатора да използва имплементацията от ConcreteA, без да използвате обвивка, извикваща ConcreteA::foo()?


person Daniel Saad    schedule 26.12.2012    source източник
comment
Кодът изглежда добре: liveworkspace.org/code/2W44n2$3   -  person SomeWittyUsername    schedule 26.12.2012
comment
След като добавя ;, което ви липсва, това се компилира добре на g++ 4.5. Можете ли да ни покажете истинския код, който причинява проблема?   -  person Mark B    schedule 26.12.2012
comment
не искам да правя това Искам да кажа на компилатора, че реализацията е предоставена от ConcreteA без използване на обвивка/мъниче. Има ли начин?   -  person Daniel Saad    schedule 26.12.2012
comment
ideone.com/aN0Eam - имате компилатор с грешки.   -  person user93353    schedule 26.12.2012
comment
поставете съобщение за грешка, което получавате   -  person marcinj    schedule 26.12.2012
comment
Кодът, който имате тук, работи добре. Ще трябва да сте по-ясни относно проблема, който смятате, че имате.   -  person Mark Ransom    schedule 26.12.2012
comment
Съжалявам, забравих да наследя InterfaceA в InterfaceB   -  person Daniel Saad    schedule 26.12.2012
comment
Защо InterfaceB е дете на InterfaceA на първо място? Това ми изглежда като дизайнерска миризма.   -  person Mark B    schedule 26.12.2012
comment
Марк, искам да използвам полиморфно поведение, използвайки InterfaceB, така че трябва да наследя от InterfaceA, за да използвам методи от интерфейсA.   -  person Daniel Saad    schedule 26.12.2012


Отговори (2)


Направете InterfaceA виртуален базов клас.

class InterfaceB : public virtual InterfaceA {  
public:  
   virtual void bar() = 0;  
};

class ConcreteA : public virtual InterfaceA {  
public:  
   virtual void foo(){}//implements foo() from interface  
};
person user93353    schedule 26.12.2012
comment
Благодаря ти много! Това е ключът =D - person Daniel Saad; 26.12.2012

Имате нужда от виртуално наследяване.

Интерфейс А, на върха на йерархията, трябва да бъде наследен практически от всички непосредствени подкласове.

class InterfaceB:public virtual InterfaceA{  
public:  
   virtual void bar() = 0;  
};

class ConcreteA : public virtual InterfaceA{  
public:  
   virtual void foo(){}//implements foo() from interface  
};
person arayq2    schedule 26.12.2012