2009-02-23 26 views
25

Câu hỏi này nói lên tất cả. Tôi có cho phép lấy được một lớp từ một cấu trúc hay tôi nên tạo một lớp nhúng cấu trúc của tôi và định nghĩa các hàm tạo bản sao và toán tử = để di chuyển giữa hai lớp?trong C++, tôi có thể lấy được một lớp từ một cấu trúc

+0

Lớp học của lớp Crit được thừa hưởng từ cấu trúc tagRECT, AFAICS. – Constantin

+0

Văn bản xấu của câu hỏi của tôi đã thay đổi. –

Trả lời

33

Trong C++ struct là (gần như) đồng nghĩa với một số class (ngoại trừ các cấp truy cập mặc định khác), vì vậy có, bạn có thể.

struct A { 
// fields are public by default 
}; 

class B: public A { 
// fields are private by default 
}; 

Tôi không quen với MFC, nhưng có vẻ như cố gắng duy trì cả API C và C++.

+0

Cảm ơn vì điều đó. Tôi đã khá chắc chắn nó là ok, nhưng chưa bao giờ thực sự nhìn thấy nó được thực hiện trong thực tế. –

9

Tất nhiên rồi. Điều khác biệt liên quan đến thừa kế là nếu bạn định nghĩa một lớp, nó sẽ kế thừa riêng từ các lớp/cấu trúc khác. Nếu bạn định nghĩa một struct và lấy được nó từ một lớp học hoặc struct, nó sẽ là một kế thừa công cộng theo mặc định:

// the following two are equivalent except that one time class is 
// used and the other time struct 
struct f : g { }; 
class f : public g { }; 

Nếu bạn tự hỏi làm thế nào bạn nên quấn C struct - tôi sẽ nhúng chúng như là một thành viên vào lớp . Bởi vì các cấu trúc C không được thiết kế để được kế thừa từ (suy nghĩ về không được bảo vệ cũng như destructor ảo trong các cấu trúc C - họ không thể có một). Chúng là những tập hợp đơn giản thu thập dữ liệu. Và đặt chúng như các thành viên sử dụng chúng như vậy (như trong "một điểm có một cặp tọa độ x và y").

Cấu trúc C cũng phơi bày các thành viên có thể không được để lộ trong lớp học. Ngăn chặn cho phép kiểm soát chính xác những gì được phơi bày và những gì không phải bằng các hàm get/set và bạn vẫn có thể cho phép nó cung cấp cho bạn một bản sao hoặc tham chiếu đến đối tượng C struct có chứa naked.

7

Có. bạn có thể lấy được một lớp từ một cấu trúc. Trong C++, một struct chỉ đơn giản là một lớp mà ở đó truy cập mặc định là public chứ không phải private. Phát sinh một lớp từ một cấu trúc chỉ thêm các hàm thành viên không phải là phần tử và/hoặc các hàm tĩnh là một kỹ thuật hữu ích để cung cấp một giao diện C++ trong khi vẫn duy trì tính tương thích với một API kiểu C.

Đây chính xác là cách tiếp cận được MFC sử dụng cho nhiều cấu trúc C (trái với những gì bạn nêu trong câu hỏi của bạn).

Ví dụ: lớp CRect được công khai bắt nguồn từ struct tagRECT (tên được sử dụng phổ biến hơn RECT là typededf cho struct tagRECT). Bởi vì struct tagRECT định nghĩa tất cả các thành viên dữ liệu và CRect chỉ thêm các hàm thành viên không phải ảo, bố cục bộ nhớ của CRects và RECTs giống nhau - bạn có thể sử dụng CRect làm đối số cho bất kỳ hàm nào mong đợi RECT và ngược lại.

Các vấn đề liên quan