2010-10-26 45 views
7

Tôi đã đọc các ý kiến ​​khác nhau về câu hỏi này. Giả sử tôi có một lớp giao diện với một loạt các phương thức ảo thuần túy. Tôi triển khai thực hiện các phương thức đó trong một lớp thực hiện giao diện và tôi không mong đợi xuất phát từ việc thực hiện.Các phương pháp thực hiện các phương thức ảo thuần túy của một lớp giao diện có được khai báo ảo không?

Có cần khai báo các phương thức trong quá trình triển khai như ảo không? Nếu đúng thì tại sao?

Trả lời

8

Không - mọi phương pháp chức năng tuyên bố ảo trong lớp cơ sở sẽ là ảo trong tất cả các lớp thừa kế

Nhưng thực hành mã hóa tốt đang nói để khai báo các phương pháp ảo

7

Nhu cầu thực sự - không. Một khi một phương thức được khai báo là ảo trong lớp cơ sở, nó vẫn ảo cho tất cả các lớp dẫn xuất. Nhưng thật tốt khi biết phương thức nào là ảo và cái nào - không, thay vì kiểm tra điều này trong lớp cơ sở. Ngoài ra, trong hầu hết các trường hợp, bạn không thể chắc chắn, nếu mã của bạn sẽ được bắt nguồn hay không (ví dụ, nếu bạn đang phát triển một số phần mềm cho một số công ty). Như tôi đã nói, nó không phải là một vấn đề, như đã từng tuyên bố là ảo, nhưng nó vẫn là ảo, nhưng chỉ trong trường hợp .. (:

1

Nếu bạn không bao giờ xuất phát từ một lớp thì không có điểm nào làm cho phương thức của nó trở nên ảo.

+3

Trừ khi nó sẽ được sử dụng như một phần của thư viện. –

7

virtual là không bắt buộc trong khai báo lớp override có nguồn gốc.. nhưng đối với sự rõ ràng, cá nhân tôi bao gồm nó.

5

Không yêu cầu đánh dấu chúng ảo.

Tôi bắt đầu bằng cách tranh luận rằng quảng cáo ảo cho người đọc mà bạn mong đợi các lớp dẫn xuất để ghi đè ảo để làm điều gì đó hữu ích. Nếu bạn đang thực hiện ảo để làm một cái gì đó, sau đó phương pháp ảo có thể không có gì để làm với các loại điều lớp học của bạn là: trong trường hợp đánh dấu nó ảo là ngớ ngẩn. hãy xem xét:

class CommsObject { 
    virtual OnConnect(); 
    virtual OnRawBytesIn(); 
}; 

class XMLStream : public CommsObject { 
    virtual OnConnect(); 
      OnRawBytesIn(); 
    virtual OnXMLData(); 
}; 

Trong ví dụ đó, OnConnect được ghi nhận là ảo trong cả hai lớp vì có ý nghĩa rằng một hậu duệ luôn muốn biết. OnRawBytesIn không có ý nghĩa để "Xuất" từ XMLStream vì nó sử dụng để xử lý các byte thô và tạo dữ liệu được phân tích cú pháp - mà nó thông báo qua OnXMLData(). Sau khi hoàn thành tất cả những điều đó, tôi sẽ lập luận rằng người duy trì một lớp thứ ba, nhìn vào XMLStream, có thể nghĩ rằng nó sẽ "an toàn" để tạo ra chức năng OnRawBytes của riêng họ và mong đợi nó hoạt động bình thường quá tải. function - tức là lớp cơ sở sẽ gọi một lớp cơ sở chính xác, và lớp bên ngoài sẽ che dấu các OnRawBytes bên trong.

Vì vậy, bỏ qua ảo đã ẩn chi tiết quan trọng từ người tiêu dùng của lớp và làm cho mã hoạt động theo cách không mong muốn.

Vì vậy, ive đi vòng tròn đầy đủ: Đừng cố gắng sử dụng nó như là một gợi ý về mục đích của một chức năng - DO sử dụng nó như là một gợi ý về hành vi của hàm: đánh dấu chức năng ảo luôn để các lập trình hạ lưu phải đọc ít tệp hơn để biết cách một hàm sẽ hoạt động khi được ghi đè.

4

Không, nó không cần thiết và nó không ngăn chặn bất kỳ lỗi mã hóa mặc dù nhiều lập trình viên thích đặt nó.

Khi C++ 0x trở thành chủ đạo, bạn có thể sử dụng công cụ chỉ định override thay thế.

2

Khi 'ảo', nó hoàn toàn là con đường xuống con cuối cùng.Afaik, đó là tính năng của C++.

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