In Stroustrup linguaggio di programmazione C++ (4 ° ed), la sezione 27.4.2 mostra una tecnica per "linearizzare" una gerarchia di classi di diamante per evitare il sovraccarico delle classi di base virtuali. Si inizia con il modello di diamante da un vero e proprio progetto (Pivot code analyzer tool):Explanation of Stroustrup Linearizing Class Hierarchies example
La versione lineare è disegnato come:
e
Il schema del codice è:
namespace ipr {
struct Node { ... };
struct Expr : Node { ... };
struct Stmt : Expr { ... };
struct Decl : Stmt { ... };
struct Var : Decl { ... };
namespace impl {
template<class T> struct Node : T { ... };
template<class T> struct Expr : Node<T> { ... };
template<class S> struct Stmt : S { ... };
template<class D> struct Decl : Stmt<Expr<D>> { ... };
struct Var : Decl<ipr::Var> { ... };
}
}
Sono confuso dalla struttura irregolare. Sulla base della descrizione iniziale, mi aspettavo impl
a guardare qualcosa di simile:
namespace impl {
template<class T> struct Node : T { ... };
template<class T> struct Expr : Node<T> { ... };
template<class S> struct Stmt : Expr<S> { ... };
template<class D> struct Decl : Stmt<D> { ... };
struct Var : Decl<ipr::Var> { ... };
}
E sto pensando lo schema completo di queste classi è:
La mia domanda è, perché le tre classi template "interne" non hanno forme parallele, come nella mia versione del codice?