类 A:public virtual B 和类 A:public B 有什么区别

STL*_*mer 2 c++ virtual multiple-inheritance

#include<iostream>
using namespace std;

class base
{
    public:
      virtual void f(){}
};

class middle1:public base
{};

class middle2:public base
{};

class derive:public middle1,public middle2
{};



int main()
{
    derive* pd=new derive();
    pd->f();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道 virtual 解决了这个问题,但如何解决?即使我们没有多重继承,我们是否可以始终编写公共虚拟以确保安全。

Ste*_*sop 5

每个实例derive都有一个middle1基类子对象和一个middle2基类子对象。

如果继承非虚拟的,则middle1基类子对象具有base基类子对象,所述middle2基类的子对象也有一个base基类的子对象。因此, 的每个实例derive都有两个base子对象,并且调用pd->f()是不明确的——base您要调用哪个对象f()

使该继承虚拟装置middle1middle2将共享单个base的子对象derive。这消除了歧义——只有一个base对象f()可以被调用。

为了安全,我们可以总是写公共虚拟吗

不必要。有可能是在你不继承层次 middle1middle2共享一个公共base的子对象。您可能会争辩说,在这种情况下,您不应该编写一个derive继承自两者的类,但如果您最终遇到这种情况,那么解决方法是:

static_cast<middle1*>(pd)->f();
pd->middle1::f();
Run Code Online (Sandbox Code Playgroud)

指定要调用f的上middle1基类的子对象,或

static_cast<middle2*>(pd)->f();
pd->middle2::f();
Run Code Online (Sandbox Code Playgroud)

来指定middle2