Go lang中的虚拟继承是什么?

  1. How to realize "Virtual Inheritance" in go?

  2. go lang compiler version: "1.3.1 windows/amd64", does it support "Virtual Inheritance" for go lang?

I never heard a C like language could support "Virtual",so I really misunderstand.

Virtual Inheritance solves a problem which does not exist if you don't have multiple inheritance. Consider the following inheritance tree:

  A
 / \
B   C
 \ /
  D

If classes B and C both provide a data-member (or method for that matter) with the same name then when accessing said member in D, you need a way to disambiguate whose ancestor's data-member (or method) you wish to access.

Virtual Inheritance is C++'s solution.

In Go you don't have inheritance to begin with; only composition and you can embed at most 1 member of any given type at once.

http://play.golang.org/p/1iYzdoFqIC

package main

type B struct {
}

func (b B) Foo() {}

type C struct {
}

func (c C) Foo() {}

type D struct {
    B
    C
}

func main() {
    d := D{B{}, C{}}
    // d.Foo() // <- ambiguous
    d.B.Foo()  // <- ok
    d.C.Foo()  // <- ok
}

"Virtual Inheritance" is something more like this

http://play.golang.org/p/8RvPmB3Pof

package main

type A struct {
    virtual int
}

func (a *A) set(v int) {
     a.virtual = v
}

func (a *A) get() int {
    return a.virtual
}

type B struct {
    *A
}

type C struct {
    *A
}

type D struct {
    *B
    *C
}

func main() {
    a := &A{}
    b := &B{a}
    c := &C{a}
    d := &D{b, c}
    d.B.set(3)
    println(d.C.get())
    return
}