2012-08-14 16 views
13

thể trùng lặp:
How do you declare an interface in C++?
Interface as in java in c++?Tương đương với các giao diện Java trong C++?

Tôi là một lập trình viên Java học C++, và tôi đã tự hỏi nếu có cái gì đó giống như giao diện Java trong C++, tức là lớp lớp khác có thể triển khai/mở rộng nhiều hơn một. Cảm ơn. p.s. Mới đây để cho tôi biết nếu tôi đã làm gì sai.

+8

C++ hỗ trợ đầy đủ [đa thừa kế] (http://en.wikipedia.org/wiki/Multiple_inheritance), vì vậy không có sự phân biệt giữa các lớp và giao diện như trong Java. Nếu bạn tạo một lớp với tất cả các phương thức ảo thuần túy thì nó tương đương với một giao diện Java. – DaoWen

+0

Lớp trừu tượng chỉ với các hàm thành viên ảo thuần túy. – oldrinb

+0

Cũng xem xét từ khóa '__interface' của VC++. kiểm tra MSDN. – MasterMastic

Trả lời

20

Trong C++, một lớp chỉ chứa các phương thức ảo thuần túy biểu thị một giao diện.

Ví dụ:

// Define the Serializable interface. 
class Serializable { 
    // virtual destructor is required if the object may 
    // be deleted through a pointer to Serializable 
    virtual ~Serializable() {} 

    virtual std::string serialize() const = 0; 
}; 

// Implements the Serializable interface 
class MyClass : public MyBaseClass, public virtual Serializable { 
    virtual std::string serialize() const { 
     // Implementation goes here. 
    } 
}; 
+2

Bạn cần ** thừa kế ảo ** để mô phỏng thực hiện giao diện Java. FTFY. –

+0

@ Cheersandhth.-Alf Đúng vậy. Cảm ơn bạn đã sửa chữa. – StackedCrooked

+1

-1, đó là * lớp trừu tượng *, không * giao diện *. Bạn không thể sở hữu đối tượng thông qua giao diện * *, tức là * giao diện * không thể có công khai hủy. (trừ khi đó là giao diện 'IDestructible' *). – Abyx

-6

Để thi đua Java interface, bạn có thể sử dụng một cơ sở thông thường với chức năng ảo chỉ thuần túy.

Bạn cần sử dụng thừa kế ảo, nếu không bạn có thể nhận được thừa kế lặp lại: cùng một lớp có thể là lớp cơ sở nhiều lần trong C++. Điều này có nghĩa là quyền truy cập của lớp cơ sở này sẽ không rõ ràng trong trường hợp này.

C++ không không cung cấp tương đương chính xác của Java interface: trong C++, trọng một hàm ảo chỉ có thể được thực hiện trong một lớp được thừa kế của lớp với phần khai báo hàm ảo, trong khi ở Java, overrider cho một phương pháp trong một interface có thể được khai báo trong một lớp cơ sở.

[VÍ DỤ:

struct B1 { 
    void foo(); 
}; 

struct B2 { 
    virtual void foo() = 0; 
}; 

struct D : B1, B2 { 
    // no declaration of foo() here 
}; 

D kế thừa quá tờ khai chức năng: B1::foo()B2::foo().

B2::foo() là thuần ảo, vì vậy D::B2::foo() cũng vậy; B1::foo() không ghi đè B2::foo()B2 không phải là lớp bắt nguồn là B1.

Do đó, D là lớp trừu tượng.

--end dụ]

Dù sao, tại sao bạn bắt chước các giới hạn độc đoán của Java trong C++?

EDIT: ví dụ được thêm để làm rõ.

+0

Tôi thường cố gắng tránh nhiều thừa kế trong C++, vì vậy tôi đã không bao giờ đi qua thừa kế ảo trước đây. Cảm ơn bạn đã làm rõ! – DaoWen

+1

@DaoWen: vui lòng lưu ý, câu trả lời này về mặt kỹ thuật ** KHÔNG TUYỆT ĐỐI ** và người đăng ký đã từ chối khắc phục. –

+1

@Cheers và hth. - Alf: anh có thể giải thích lý do tại sao nó không chính xác? – DaoWen