先说下问题,我声明了一个基类,X,然后又从X虚拟派生了两个类,Y,Z。接着定义类A,A从Y,Z派生而来。X,y,z中均含有一个void f()函数。现在我在main中定义如下:X *px;A a;px=&a;px->f();delete px;在运行的时候发现px->f()调用的是X中的f().而不是我想像中的A中指定的Y::f()中的f(),经过查阅书本,问题已经解决,先归纳如下:X,Y,Z类中都含有同一个方法,A有派生于Y,Z,因此定义了一个A的实例后,调用f()方法,在这里如果不指名调用哪一个类中的方法,将会产生错误,为了避免此问题的产生,可以采取的方法如下:(假设我们调用的事Y类中的方法)1、在A类中指名,如:using Y::f();2、在代码中使类Y的派生层次高于类Z的派生层次,因为派生层次越高,调用具有同名的方法时优势越大。举个例子: 在这个问题中我们可以这样定义:我们可以使 Y:virtual public X{ public: void f();}Z:public Y{}A:public Z,virtual public X{}此时声明A的实例在调用f()。则调用的是Y中的方法。还有: Y:virtual public X{ public: void f();}Z:virtual public X{}A:public Y,public Z{}此时声明A的实例在调用f()。则调用的也是Y中的方法。这就是优势,即派生层次越高,调用同名的方法时有时越明显

评论