我在很多地方都读到过,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 {
}
};
问题是,除非您指定 C
和 B
需要共享一个 A
子对象(所有派生类都包含它们的基作为子对象),您通过继承 B
和 C
获得的两个子对象将不相关。
在您的原始方案中,C
为 A
中的纯虚拟成员提供的实现不被视为 所需的相同功能的实现>
。B
中的 A
因为现在只有一个 A
子对象,所以这个问题就消失了。但请注意,虚拟继承并非没有代价。所以想想你是否真的想要采用这样的设计。
关于java - 在 C++ 中重叠类似 java 的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44899594/