java - 在 C++ 中重叠类似 java 的接口(interface)

标签 java c++ inheritance interface

我在很多地方都读到过,Java 的接口(interface)可以使用 C++ 的抽象类和所有纯虚拟方法 100% 模拟。

我正在尝试转换这段 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();

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

但无论我多么努力,我总是以 C++ 提示歧义和/或缺少主体定义而告终。

我的想法是,我想派生自“C”,它包含所有类的一些共享代码(此处:“D”,但还有更多),但仍保持“D”与任何类 100% 可互换的 promise 实现“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 {
                  ^

最佳答案

这是一个通过 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 中的纯虚拟成员提供的实现不被视为 所需的相同功能的实现>B 中的 A

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

关于java - 在 C++ 中重叠类似 java 的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44899594/

相关文章:

java - 如何在年轻一代集合中找出 Activity 对象?

c++ - 二值图像角点检测

c# - C# 中丑陋的继承

java - 如何正确 append 到 JTextPane

java - JAXB schemagen 不引用剧集文件中的类

c++ - C中指向二维数组的二维指针

c# - 继承数据库的最佳方式

c++ - 多态覆盖

java - 使用关键字this和类名访问静态实例变量的区别

c++ - 是否可以从 C++ 中的线程返回退出代码?