Tôi đã đọc ở nhiều nơi giao diện của Java có thể được mô phỏng 100% bằng cách sử dụng lớp trừu tượng của C++ với tất cả các phương thức ảo thuần túy.Chồng chéo giao diện giống như java trong C++
Tôi đang cố gắng để chuyển đổi đoạn mã này 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();
vào một cái gì đó như thế này trong 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();
nhưng không có gì khó khăn khi tôi cố gắng, tôi luôn luôn kết thúc với C++ phàn nàn về sự mơ hồ và/hoặc thiếu định nghĩa cơ thể.
Ý tưởng là tôi muốn lấy từ "C" có chứa một số mã chia sẻ cho tất cả các lớp (ở đây: "D" nhưng có nhiều hơn) và vẫn giữ lời hứa rằng "D" là 100% hoán đổi cho nhau bất kỳ lớp nào thực hiện "B" (bao gồm các phần từ "A").
Các lỗi tôi nhận được với C++ mã trên là:
../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 {
^
bạn có thể vui lòng cho chúng ta thấy một [Minimal, *** Toàn bộ ***, và kiểm chứng Ví dụ] (http: // stackoverflow.com/help/mcve) và bao gồm các lỗi * thực tế * mà bạn nhận được (sao chép, dán, hoàn chỉnh, đầy đủ và chưa chỉnh sửa)? –
@Someprogrammerdude: đoạn mã * được * hoàn thành, tôi đoán tôi không phải cung cấp một hàm main(). Tôi đã thêm đầu ra trình biên dịch. –
Bạn có thể gặp phải vấn đề * kim cương *. –