I read in many places that the Java interface can be 100% emulated using the C ++ abstract class with all the pure virtual methods.
I am trying to convert this piece of java code:
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(); da(); db();
into something like this in 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 A { public: virtual void a() const override { } }; class D : public C, public B { public: virtual void b() const override { } }; D d; da(); db();
but no matter how hard I try, I always end up complaining about ambiguity and / or missing body definitions.
The idea is that I want to get from "C", which contains some common code for all classes (here: "D", but there are more), and still keep the promise that "D" is 100% interchangeable with any a class that implements "B" (including parts from "A").
Errors I get with C ++ code above:
../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 da(); ^ ../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 { ^
source share