2010-05-05 26 views

Trả lời

1

Nó thực hiện chính xác những gì nó phải làm. Các bóng có nguồn gốc cơ sở.

+1

Chức năng có thể bị quá tải và ghi đè. Thành viên không thể. 'Derived :: m_pants' và' Base :: m_pants' là hai biến hoàn toàn khác nhau. Nếu bạn sử dụng 'std :: cout << sizeof (Base) << '' << sizeof (có nguồn gốc) << std :: endl;' trong một chương trình thử nghiệm nhỏ, bạn sẽ thấy rằng 'Derived' có kích thước lớn hơn 'Base'. Bạn thậm chí có thể làm cho các biến sử dụng cùng tên và loại, nhưng chúng vẫn là các biến khác nhau vì chúng thuộc về các lớp khác nhau. – Dustin

+1

Ah, bạn đã thay đổi cụm từ bạn đã sử dụng từ "ghi đè" thành "bóng", do đó làm mất hiệu lực nhận xét của tôi. Cảm ơn bạn đã sửa chữa nó. :) – Dustin

+0

@Dustin, cảm ơn bạn đã cải thiện thuật ngữ của tôi. –

7

Nó không bị gắn cờ là lỗi vì nó không phải là lỗi. Không có gì nói rằng bạn không thể có các thành viên trong một lớp dẫn xuất được đặt tên giống như các thành viên trong một lớp cơ sở.

Nếu bạn có một đối tượng obj loại Derived, thì obj.m_Pants đề cập đến m_Pants trong Derived. Nếu bạn muốn tham khảo thành viên cơ sở, bạn có thể làm như vậy bằng cách sử dụng obj.Base::m_Pants.

Nếu bạn đang ở trong một hàm thành viên của Base hoặc có một Base* trỏ đến một đối tượng kiểu Derived, sau đó m_Pants luôn đề cập đến thành viên của Base, bởi vì trong những bối cảnh không có kiến ​​thức của lớp Derived và nó các thành viên.

Vâng, đó không phải là lỗi mã; nó gần như chắc chắn là một lỗi thiết kế.

+0

Tôi đã thử 'int val = obj.Base :: m_Pants' trong C++ Builder6 và nhận lỗi biên dịch: ** E2247 'Base :: m_Pants' không thể truy cập ** (m_Pants là công khai) –

+0

Nó chỉ biên dịch với get/set funcs 'public: int getBase() {return Base :: m_Pants}' –

+3

@Alexander: Vâng, trong đoạn mã ví dụ, 'Derived' thừa kế riêng từ' Base', vì vậy, bạn nói đúng rằng điều đó sẽ không ' t làm việc. Bạn cần phải thay đổi nó để kế thừa công khai. –

1

Một biến là ẩn khác. Nó giống như nếu bạn khai báo tên biến thành viên x và sau đó có một hàm thành viên khai báo x riêng của nó, ngoại trừ ở đây, một trong các biến nằm trong lớp cơ sở và một biến nằm trong lớp dẫn xuất.

int func(int x) 
{ 
    return x; 
} 

sẽ trả về giá trị của x bạn thông qua tại, không phải là của biến thành viên x. Một biến "bóng" khác. Đó là lý do tại sao bạn nên đặt tên cho các biến của mình để chúng không bao giờ có tên có thể xung đột.

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