而现在我们换种方式使用虚继承:

class stream
{
public:
    stream(){cout<<"stream::stream()!"<<endl;}
};

class iistream:public stream
{
public:
    iistream(){cout<<"istream::istream()!"<<endl;}
};

class oostream:public stream
{
public:
    oostream(){cout<<"ostream::ostream()!"<<endl;}
};

class iiostream:virtual iistream,virtual oostream
{
public:
    iiostream(){cout<<"iiostream::iiostream()!"<<endl;}
};

int main(int argc, const char * argv[])
{
    iiostream oo;
};

  其输出结果为:

  stream::stream()!
  istream::istream()!
  stream::stream()!
  ostream::ostream()!
  iiostream::iiostream()!

  从结果可以看到,其构造过程中重复出现基类stream的构造过程。这样完全没有达到虚拟继承的目的。其继承结构为:

  stream              stream
                       /
  istream    ostream
                     /
  iiostream

  从继承结构可以看出,如果iiostream对象调用基类stream中的成员方法,会导致方法的二义性。因为iiostream含有指向其虚继承基类 istream,ostream的vptr。而 istream,ostream包含了stream的空间,所以导致iiostream不知道导致是调用那个stream的方法。要解决改问题,可以指定vptr,即在调用成员方法是需要加上作用域,例如

class stream
{
   void f(){cout<<"here!"<<endl;}
}
main()
{
  iiostream ii;
  ii.f();
}