Próbuję zdefiniować typy interfejsów w C++ za pomocą klas abstrakcyjnych i zaimplementować je w konkretnych klasach. Problem, na który napotykam, polega na tym, że nie mogę jednocześnie dziedziczyć i interfejsować się z innego interfejsu i dziedziczyć implementację z podstawowej klasy betonu.Implementowanie interfejsów w C++ z odziedziczonymi klasami betonu
Moim celem jest zdefiniowanie hierarchii interfejsów, które mogą dziedziczyć po mniej złożonych interfejsach bazowych. Chcę również móc rozszerzyć implementację interfejsów przez dziedziczenie z konkretnych klas (np. Dziedziczenie z TObjectA w poniższym przykładzie).
To jest to, co mam. Błąd, który otrzymuję, jest "obiektem abstrakcyjnego typu klasy" TObjectB "nie jest dozwolone". Wierzę, że wiem, dlaczego, ponieważ nie zaimplementowałem MethodA() w TObjectB. Ale naprawdę chcę mieć implementację zapewnioną przez klasę podstawową (TObjectA) i nadal mieć hierarchie interfejsów (IInterfaceB dziedziczy z IInterfaceA). Nie chcę również powtarzać wszystkich dziedziczonych metod interfejsu w moich pochodnych klasach konkreacji. Jak mogę to zrobić?
class IInterfaceA
{
public:
virtual void MethodA() = 0;
};
class IInterfaceB : IInterfaceA
{
public:
virtual void MethodB() = 0;
};
class TObjectA : public IInterfaceA
{
public:
void MethodA() { cout << "Method A"; }
};
class TObjectB : public TObjectA, public IInterfaceB
{
public:
void MethodB() { cout << "Method B"; }
};
void TestInterfaces()
{
IInterfaceB* b = new TObjectB(); // error: object of abstract class type "TObjectB" is not allowed
b->MethodB();
delete b;
}
Potrzebujesz wirtualnych klas bazowych. Na przykład. [patrz tutaj] (http://stackoverflow.com/questions/4605556/when-virtual-inheritance-is-a-good-design/4606206#4606206) –