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

时间:2017-07-04 07:27:40

标签: java c++ inheritance interface

我已经在许多地方读过,使用C ++的抽象类和所有纯虚方法可以100%模拟Java接口。

我试图转换这段java代码:

alert(dropdown[0].textContent);

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

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();

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

我的想法是,我想从" C"它包含了所有类的一些共享代码(这里:" D"但是还有更多的代码),但仍然承诺" D" 100%可与任何实施" B" (包括来自" A")的部分。

我在上面的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();

2 个答案:

答案 0 :(得分: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 {
    }
};

问题是除非你指定CB都需要共享一个A子对象(所有派生类都包含它们作为子对象的基础),所以从继承BC获得的子对象将不相关。

在原始方案中,CA中的纯虚拟成员提供的实现不被视为A B所需的相同功能的实现。 1}}。

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

答案 1 :(得分:0)

您需要的只是在D类中实现a():

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:
    void b() const override {
    }
    void a() const {
        C::a();
    }
};




int main()
{
    D d;
    d.a();
    d.b();
    return 0;
}