Si potrebbe voler dare un'occhiata a Loki TypeLists se si ha realmente bisogno di essere in grado di tracciare le origini e di enumerare attraverso i tipi. Non sono sicuro che ciò che stai chiedendo sia davvero possibile senza un sacco di lavoro. Assicurati di non essere troppo ingegnerizzato qui.
Su una nota leggermente diversa, se si utilizzerà MI in questo modo (ad esempio, il temuto diamante), allora si dovrebbe essere molto espliciti su quale membro virtuale si desidera. Non riesco a pensare a un buon caso in cui si desidera scegliere la semantica di B::fn()
su C::fn()
senza prendere una decisione esplicita quando si scrive D
. Probabilmente ne sceglierete uno sull'altro (o su entrambi) in base a ciò che fa il singolo metodo. Una volta presa una decisione, il requisito è che le modifiche ereditate non cambino le aspettative o l'interfaccia semantica.
Se siete davvero preoccupati per lo scambio di una nuova classe, dicono E
al posto di dire B
dove E
non discende da B
ma offre la stessa interfaccia, allora si dovrebbe davvero utilizzare l'approccio modello anche se non sono sicuro perché c'è un static_cast<>
in là ...
struct A {
virtual ~A() {}
virtual void f() = 0;
};
struct B: A {
virtual void f() { std::cout << "B::f()" << std::endl; }
};
struct C: A {
virtual void f() { std::cout << "C::f()" << std::endl; }
};
template <typename Base1, typename Base2>
struct D: Base1, Base2 {
void g() { Base1::f(); Base2::f(); }
};
int main() {
D<B,C> d1;
D<C,B> d2;
d1.g();
d2.g();
return 0;
}
// Outputs:
// B::f()
// C::f()
// C::f()
// B::f()
funziona bene e sembra un po 'più facile da guardare.
fonte
2009-03-05 21:01:54
Non ho trovato una domanda che risponda a questo problema specifico. Puoi? – shoosh
Non è perché si tratta di ereditarietà multipla che è possibile indovinare che è già stato risolto in altri post. Ha chiesto "Quello che sto cercando di fare è avere D in qualche modo elencare tutte le istanze di fn() che ha nella sua discendenza. Questo è possibile in qualche altro modo che funzioni virtuali? '.Anche se penso che sia stata una domanda un po 'ingenua, nessuna delle domande che hai collegato qui parla di una cosa del genere. Penso che fosse piuttosto specifico e unico nel suo interrogatorio. -1. –