在C++中重叠类似java的接口

Mir*_*cek 5 c++ java inheritance interface

我已经阅读过许多地方,使用C++的抽象类和所有纯虚方法可以100%模拟Java的界面.

我正在尝试转换这段java代码:

interface A {
    void a();
}

interface B extends A {
    void b();
}

class C implements A {
    public void a() {
    }
}

class D extends C implements B {
    public void b() {
    }
}

D d = new D();
d.a();
d.b();
Run Code Online (Sandbox Code Playgroud)

在C++中使用这样的东西:

class A {
public:
    virtual void a() const = 0;
protected:
    virtual ~A() {
    }
};

class B : public A {
public:
    virtual void b() const = 0;
protected:
    virtual ~B() {
    }
};

class C : public /*implements*/ A {
public:
    virtual void a() const override {
    }
};

class D : public /*extends*/ C, public /*implements*/ B {
public:
    virtual void b() const override {
    }
};

D d;
d.a();
d.b();
Run Code Online (Sandbox Code Playgroud)

但无论我怎么努力,我总是抱着C++抱怨歧义和/或缺少身体定义.

我的想法是,我想从"C"派生出来,其中包含所有类的一些共享代码(这里:"D"但是它们中有更多)并且仍然承诺"D"与任何实现"实现"的类100%可互换B"(包括"A"部分).

我上面用C++代码得到的错误是:

../untitled1/main.cpp: In function ‘int main(int, char**)’:
../untitled1/main.cpp:39:7: error: cannot declare variable ‘d’ to be of abstract type ‘D’
     D d;
       ^
../untitled1/main.cpp:28:7: note:   because the following virtual functions are pure within ‘D’:
 class D : public /*extends*/ C, public /*implements*/ B {
       ^
../untitled1/main.cpp:7:18: note:   virtual void A::a() const
     virtual void a() const = 0;
                  ^
../untitled1/main.cpp:40:7: error: request for member ‘a’ is ambiguous
     d.a();
       ^
../untitled1/main.cpp:7:18: note: candidates are: virtual void A::a() const
     virtual void a() const = 0;
                  ^
../untitled1/main.cpp:23:18: note:                 virtual void C::a() const
     virtual void a() const override {
                  ^
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 9

这是一个由虚拟继承解决的问题A.

class A {
public:
    virtual void a() const = 0;
protected:
    virtual ~A() {
    }
};

class B : public virtual A {
public:
    virtual void b() const = 0;
protected:
    virtual ~B() {
    }
};

class C : public virtual A {
public:
    virtual void a() const override {
    }
};

class D : public C, public  B {
public:
    virtual void b() const override {
    }
};
Run Code Online (Sandbox Code Playgroud)

问题是,除非你指定两个CB需要共享的A子对象(所有派生类包含他们的基地作为子对象),你会得到继承两两子对象BC将是无关的.

在原来的方案中,所提供的实施C在纯虚成员A不被认为是由所需的相同功能的实现AB.

由于现在只有一个A子对象,这个问题就消失了.但请注意,虚拟继承并非没有代价.所以想想你是否真的想要采用这样的设计.