Erste Lösung
Diese Frage erinnern die 'Fassade' Design-Muster. Dies sollte als diese neu zu schreiben werden:
class AC : public A
{ public: virtual void f(){ cout << "f() from A" << endl;}; };
class BC : public B ...
class C : public AC, public BC {};
wobei C die ‚Fassade‘ ist.
C* c = new C();
c->AC::f();
c->BC::f();
Wenn Sie zwischen AC & BC sollte dies die Arbeit tun, wie es offuscated is'nt jede Aktie Einschränkung nicht haben:
So in der richtigen Aufrufsyntax so etwas wie das sein sollte.
Zweite Lösung
Ein andere Lösung, Dank an Casey (siehe ersten Kommentar), ist eine Vorwärts-Deklaration der Klasse C in einer Vorlage verwenden, um Anrufe zu Methoden letztere definieren zu können.
template <typename C>
class AC : public A {
public:
void f() { static_cast<C&>(*this).f_from_A(); }
};
template <typename C>
class BC : public B { ... };
so kann der Implementierungsteil in der gleichen Klasse erfolgen.
Der anrufende Teil ist sauberer, weil es zeigt keine Implementierungsdetails und es am nächsten an der Frage ist:
C* c = new C();
((A*) c) -> f();
((B*) c) -> f();
Es ist nicht mehr ‚default‘ f() auf C und es ist möglich, das erwartete Verhalten der Vererbung zu brechen, und es ist schwerer zu lesen.
Seien Sie vorsichtig mit Mehrfachvererbung. Was versuchst du zu machen? – Manu343726
@ Manu343726 nicht auf eine Tangente gehen, aber mehrfache Vererbung mit ABCs wird im Allgemeinen als in Ordnung betrachtet. –
@Tim ich stimme zu, es ist in Ordnung, ich schlage ihm nur vor, vorsichtig zu sein. Was ich nicht verstehe, ist, was er mit diesem Design zu erreichen versucht. – Manu343726