2009-10-14 11 views
21

Với lớp cơ sở này:Sử dụng "Công khai" trong khai báo lớp dẫn xuất?

class Manager : public Employee 
{ 
    EmployeeList employees; 

    public: 
    Manager(char* name, Employee* people); 
    void print(); 
}; 

và điều này::

class Manager : Employee 
{ 
    EmployeeList employees; 

    public: 
    Manager(char* name, Employee* people); 
    void print(); 
}; 
+4

Sử dụng std :: string over char * và std :: vector trên một con trỏ tới mảng. – GManNickG

+4

Tôi không đồng ý. std :: string thêm một lớp chi phí để cho phép dữ liệu có độ dài thay đổi. Bạn nên xem xét nhu cầu của bạn và chọn một cách khôn ngoan. – sep

+2

Nếu không có kiến ​​thức tốt về ngữ cảnh, lời khuyên để sử dụng 'std :: vectơ' thay vì C-mảng và 'std :: string' thay vì C-strings có giá trị rất ít, nếu có. – AnT

Trả lời

3

Without rằng 'công'

class Employee 
{ 
    char* name; 
    int age; 

    public: 
    Employee(char* name); 
    void print(); 
}; 

Liên quan đến "công cộng", sự khác biệt giữa điều này là những gì 'Nhân viên' sẽ trở thành một lớp cơ sở tư nhân của 'Quản lý'.

Các lớp được khai báo với từ khóa 'lớp' có các thành viên riêng của họ theo mặc định và đặt các lớp cơ sở của họ là riêng tư theo mặc định.

Các lớp được khai báo với từ khóa 'struct' sẽ hiển thị công khai thành viên của họ theo mặc định và mặc định đặt các lớp cơ sở của họ ở chế độ công khai.

0

Trong C++, kế thừa là riêng tư theo mặc định. Tuy nhiên, với bất kỳ mã nào bằng cách sử dụng lớp Manager, có vẻ như hầu như không có sự khác biệt, vì chúng có cùng phương pháp.

Tuy nhiên, bạn sẽ không thể truyền đối tượng Trình quản lý cho một Nhân viên. Bạn cũng sẽ không thể truy cập biến số employees từ bên trong lớp Trình quản lý.

+0

Kiểu thừa kế mặc định trong C++ phụ thuộc vào khóa-lớp được sử dụng trong khai báo lớp. 'lớp' - riêng tư, 'struct' - công khai. – AnT

+0

Có, nhưng OP đang sử dụng một lớp, vì vậy điều này đúng trong ngữ cảnh này. –

+2

Có, trong ngữ cảnh này. Nhưng không phải "trong C++". "Trong C++" gợi ý một bối cảnh tổng quát hơn đáng kể, theo ý kiến ​​của tôi. – AnT

31

Giá trị mặc định là kế thừa riêng. lấy ví dụ này:

class B { }; 
class D: B { }; 

sử dụng kế thừa riêng làm mặc định của nó. Điều này có nghĩa rằng D được tất cả các lĩnh vực và phương pháp B có (nếu chúng ta thực sự tuyên bố bất kỳ) được bảo vệ và công cộng, nhưng không thể được đúc để một B. Do đó, mã này không thành công:

void foo(B* argument) {} 
foo(new D);     //not allowed 

Nếu D công khai kế thừa từ B, sau đó một D có thể được đúc thành một B, và cuộc gọi chức năng này sẽ là tốt.

Sự khác biệt thứ hai là tất cả các thành viên protected và công cộng trong B trở thành tin thành viên trong D.

Điều này thực sự có ý nghĩa gì? Thừa kế công khai có nghĩa là D IS_A B, nhưng thừa kế riêng có nghĩa là "được thực hiện theo". Thừa kế D từ B có nghĩa là bạn muốn tận dụng một số tính năng trong B, nhưng không phải vì D IS_A B hoặc vì có bất kỳ kết nối khái niệm nào giữa B và D.: D

+1

Câu trả lời tuyệt vời! –

+0

Hoàn hảo chỉ là những gì tôi đang tìm kiếm! –

+0

cảm ơn, đối với những người khác như tôi, điều này sẽ trở nên rõ ràng hơn sau khi đọc bài viết đầu tiên: http://stackoverflow.com/a/1372858/1511337 –