2010-01-06 63 views

Trả lời

20

Lớp dẫn xuất cần các thành viên riêng tư mặc dù nó không thể truy cập trực tiếp. Nếu không thì hành vi của nó sẽ không xây dựng trên lớp mà nó phát sinh từ đó.

Ví dụ, giả vờ những thứ tin là:

int i; 

và lớp có một geti() và seti(). Giá trị của i phải được đặt ở đâu đó, ngay cả khi nó là riêng tư,

+0

Tôi thừa nhận điều đó, hiếm khi tôi bắt gặp một câu trả lời tuyệt vời và thanh lịch như vậy. Cảm ơn bạn sir cho câu trả lời này đặc biệt dòng cuối cùng :)) –

0

Lớp dẫn xuất không "kế thừa" các thành viên riêng của lớp cơ sở theo bất kỳ cách nào - nó không thể truy cập chúng, vì vậy nó không "kế thừa" chúng.

Một thể hiện của lớp dẫn xuất chứa các cá thể của các thành viên riêng của lớp cơ sở, vì các lý do rõ ràng.

Vì vậy, tôi thậm chí không biết ý bạn là gì bởi câu hỏi đó.

+2

"Lớp dẫn xuất không" kế thừa "các thành viên riêng của lớp cơ sở" Có - trừ khi bạn đang cố gắng tách các đoạn mã cú pháp. –

+1

Tôi giả định rằng bằng cách "kế thừa", ông có nghĩa là "có thể truy cập" - đó là giải thích vô nghĩa nhất của câu hỏi. –

2

Lý do là vì các lớp dẫn xuất có mối quan hệ is-a với siêu lớp.

Khởi tạo lớp dẫn xuất IS Một phiên bản siêu lớp ... chỉ với nhiều (hoặc ít hơn do đặt một số hàm siêu lớp riêng tư).

+2

Rất khó hiểu đối với một người mới đến OOP – Jaywalker

+0

@Jaywalker Tôi không thấy nó khó hiểu như thế nào. Lớp cơ sở _is-a_ cơ sở lớp và thành phần cơ bản của nó vẫn cần có khả năng truy cập các biến 'private' trong các phương thức của nó, bất kể nó cho phép lớp dẫn xuất sử dụng chúng trực tiếp hay không. –

10

Phương thức công cộng và được bảo vệ của lớp cơ sở vẫn có thể truy cập các biến riêng của lớp cơ sở, và các phương thức này có sẵn trong lớp dẫn xuất.

4

Lớp cơ sở vẫn có thể sử dụng các biến thành viên riêng & phương pháp.

Nếu bạn muốn các lớp dẫn xuất có quyền truy cập vào các thành viên nhưng giữ cho các thành viên đó bị ẩn khỏi thế giới bên ngoài, hãy đặt chúng protected:.

Dưới đây là một ví dụ để minh họa:

class Base 
{ 
public: 
    Base() : val(42.0f) {}; 
    float GetValue() const 
    { 
    return val_; 
    } 
private: 
    float val_; 
}; 

class Derived : public Base 
{ 
public: 
    float ComputedValue() const 
    { 
    return GetValue() * 2.0f; 
    } 
}; 
4

Đừng quên rằng các lớp cơ sở có thể có phương pháp mà không phải là private, và do đó thể truy cập bằng các lớp dẫn xuất. Các phương thức lớp cơ bản protected hoặc public vẫn có thể gọi phương thức lớp cơ sở private. Điều này đặc biệt hữu ích nếu bạn muốn khóa xuống chức năng cốt lõi trong lớp cơ sở, chẳng hạn như với một mô hình Template Method thiết kế thực hiện:

class base 
{ 
public: 

    virtual ~base() { /* ... */ } 

    virtual void base_func() { foo_private(); } 
    virtual void do_func() = 0; 

private: 

    void foo_private() 
    { 
    // pre-do_func() operations 

    do_func(); 

    // post-do_function operations 
    } 

}; 

class derived : public base 
{ 
public: 

    void derived_func() { base_func(); } 

    virtual void do_func() 
    { 
    // Derived class specific operations 
    } 
}; 
2

Như đã vạch ra bởi câu trả lời khác ở đây, lớp có nguồn gốc cú pháp không thể truy cập thành viên riêng của lớp cơ sở; nhưng nó cần phải có một bản sao giống nhau trong bố cục bộ nhớ của nó. Hãy suy nghĩ của đúc. bằng cách sử dụng 'C' đúc bạn có thể đúc một nguồn gốc đến một cơ sở tư nhân. Trình biên dịch sau đó sẽ cần sự bù đắp bộ nhớ chính xác để tạo ra một bố trí bộ nhớ hợp lệ cho đối tượng cơ sở.

Ví dụ:

class Base { 
public: 
    void printA() { 
    a = 10; 
    std::cout << a << std::endl; 
    } 
private: 
    int a; 
}; 
class Derived : private Base{ 
    int b; 
}; 

Derived* d = new Derived; 
Base* b = (Base*)d; 
b->printA(); 
0

khi đối tượng lớp dẫn xuất được tạo, hàm tạo lớp cơ sở cũng được gọi để tạo đối tượng cơ sở. nếu các thành viên private của lớp cơ sở không được cấp phát bộ nhớ thì đối tượng cơ sở sẽ không đầy đủ.

do đó đối tượng lớp dẫn xuất kế thừa các thành viên riêng tư của cơ sở, vì chúng được tạo trong khi tạo đối tượng lớp cơ sở, nhưng không thể truy cập được vì chúng là riêng tư.

0

Mặc dù các thành viên riêng không thể truy cập từ lớp cơ sở, chúng được thừa hưởng bởi vì các thuộc tính này được lớp dẫn xuất sử dụng với sự trợ giúp của các hàm không phải riêng tư.

Các thành viên riêng của lớp cơ sở không được truy cập trực tiếp, nhưng được dẫn xuất bởi lớp cơ sở theo lớp dẫn xuất.

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