2012-05-12 51 views
7

Có một lệnh tồn tại, như \deprecated, nhưng để đánh dấu các chức năng ghi đè không?Đánh dấu các chức năng ghi đè

Java có chú thích @override cho các hàm bạn đã ghi đè. Tôi muốn làm tương tự trong C++, để tôi có thể thấy các hàm siêu lớp mà tôi đã ghi đè. Tốt nhất, trang tài liệu cũng nên hiển thị tất cả các hàm thành viên của lớp, được kế thừa, nhưng không được ghi đè rõ ràng với các siêu liên kết đến các hàm siêu lớp.

Tôi biết có cách sao chép tài liệu từ phương thức siêu lớp. Nhưng tôi không muốn sao chép toàn bộ tài liệu. Tôi chỉ muốn biết rằng một chức năng được kế thừa. Hành vi phải tương tự như tùy chọn không được chấp nhận để đánh dấu các chức năng cũ đó bằng một thanh.

+0

Có một [ 'overload'] (http: // www.stack.nl/~dimitri/doxygen/commands.html#cmdoverload) lệnh. – Chris

+1

@Chris: quá tải! = Ghi đè, xem http://stackoverflow.com/a/429236/79455 – rve

+0

@rve Bạn nói đúng, tôi rõ ràng không đọc đủ câu hỏi. – Chris

Trả lời

7

Mỗi chức năng bị ghi đè tự động nhận được thông báo đã được triển khai lại. Ví dụ, hàm được ghi đè trong một lớp dẫn xuất nhận được thông báo "Reimplemented from MyBaseClass."

Nó cũng đặt thông báo trong tài liệu của lớp cơ sở. Có đề cập đến "Reimplemented in Test"

Để hiển thị tất cả các chức năng, kể cả các hàm được kế thừa, bạn có thể đặt INLINE_INHERITED_MEMB thành YES. Sau đó Doxygen sao chép tài liệu của mọi hàm thừa kế, nhưng không bị ghi đè vào tài liệu của lớp dẫn xuất.

Ví dụ, khi sử dụng nguồn này:

class TestBase 
{ 
    public: 
     /** 
     * Base class function. 
     */ 
     virtual void function(); 

     /** 
     * Another function. 
     */ 
     virtual void another(); 
}; 

class Test: public TestBase 
{   
    public: 
     /** 
     * Overridden function. 
     */ 
     virtual void function(); 
}; 

Và thiết INLINE_INHERITED_MEMB-YES sẽ cho kết quả trong các tài liệu sau cho lớp Derived: (Với Doxygen 1.7.6)

Thành viên Tài liệu Chức năng

virtual void TestBase::another ( ) [virtual, inherited]
Một chức năng khác.

virtual void Test::function ( ) [virtual]
Có nguồn gốc.
Được thực hiện lại từ TestBase.

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm.

+0

Hi rve, cảm ơn đó là một mẹo tốt, nhưng không phải là giải pháp toàn diện cho tôi. Nếu tôi ghi đè lên các chức năng của riêng mình, điều đó là ổn, nhưng nếu tôi ghi đè, ví dụ: một hàm qt, doxygen không nhận ra rằng nó bị ghi đè. Tôi cũng không nhận được khối được kế thừa trong ngoặc đơn, nhưng chỉ là một thông điệp được thực hiện lại. Đó là ok, nhưng tôi muốn, tôi có thể nhìn thấy tình trạng overriden trực tiếp trong tổng quan danh sách thành viên. – Theo

+0

Một chút trễ, nhưng bạn có thể sử dụng các tệp thẻ để cho Doxygen biết về các lớp được ghi lại ở nơi khác. Nếu bạn có một tập tin thẻ cho QT, sau đó (tôi nghĩ) nó sẽ đánh dấu các chức năng thừa kế từ QT. Chưa bao giờ thử nó. – rve

0

Kể từ C++ 11 bạn có thể sử dụng override specifier:

class A { 
    virtual void jump() = 0; 
    void talk() {} 
}; 

class B: public A { 
    void jump() const override {...} // Error: B:: jump does Not overrides A:: jump (A::Jump is not const...) 
    void jump() override {...} // OK: B:: jump overrides A:: jump 
    void talk() override {...} // Error: A::talk is not virtual 
}; 

gốc Ví dụ và doc chính thức: http://en.cppreference.com/w/cpp/language/override

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