2008-09-22 11 views
5

Thành ngữ giao diện không phải ảo mô tả cách thức các phương thức ảo là các điểm tùy chỉnh không công khai, và các phương thức công cộng là không ảo để cho phép lớp cơ sở kiểm soát mọi lúc cách các điểm tùy chỉnh được gọi.thành ngữ giao diện phi ảo cho hơn hai cấp độ thừa kế?

Đây là một thành ngữ thanh lịch và tôi muốn sử dụng nó, nhưng làm thế nào nó hoạt động nếu lớp có nguồn gốc là một lớp cơ sở của riêng mình

Trả lời

5

Nó hoạt động, bởi vì lớp dẫn xuất có thể ghi đè lên một hàm riêng ảo của một lớp cơ sở, ngay cả khi hàm lớp cơ sở ghi đè hàm lớp cơ sở của nó.

Điều này hoàn toàn hợp pháp:


class Parent 
{ 
public: 
    int foo() {return bar();} // the non-virtual public interface 
private 
    virtual int bar(); 
}; 

class Child : public Parent 
{ 
private: 
    virtual int bar(); // overrides Parent::bar() 
}; 

class Grandchild : public Child 
{ 
private: 
    virtual int bar(); // overrides Child::bar(); 
}; 
1

Các lớp được thừa kế có thể quyết định cho chính nó:

Bạn có thể chỉ ghi đè hoàn toàn phương thức bằng cách thực hiện hàm ảo. Bạn có thể tăng thêm phương thức bằng cách gọi hàm lớp 'ở giữa' ở một số điểm trong phương thức lớp dẫn xuất của bạn.

Nếu đó không phải là những gì bạn muốn, bạn cần thiết lập rõ ràng trong lớp 'ở giữa'. Tôi sẽ không mặc dù. Nếu bạn thấy mình mong muốn điều này, nó có thể có nghĩa là bạn đã không cung cấp cho lớp cơ sở đủ các điểm tùy chỉnh.