2010-07-02 2 views
21

Điều này có thể đã được hỏi trước trên SO, nhưng tôi không thể tìm thấy một câu hỏi tương tự.Tôi có cần phải chỉ định ảo trên các phương thức lớp con không?

Hãy xem xét các hệ thống phân cấp lớp sau đây:

class BritneySpears 
{ 
    public: 

    virtual ~BritneySpears(); 
}; 

class Daughter1 : public BritneySpears 
{ 
    public: 

    virtual ~Daughter1(); // Virtual specifier 
}; 

class Daughter2 : public BritneySpears 
{ 
    public: 

    ~Daughter2(); // No virtual specifier 
}; 

Có một sự khác biệt giữa Daughter1Daughter2 lớp học?

Hậu quả của việc xác định/không chỉ định virtual trên phương thức phá hủy/phương thức phụ là gì?

Cảm ơn.

+2

Lưu ý cho người đọc: cũng hãy xem từ khóa ['ghi đè'] (http://stackoverflow.com/questions/13880205/override-in-c11) trong C++ 11 có liên quan chặt chẽ đến chủ đề đó. – ereOn

Trả lời

28

Không, bạn về mặt kỹ thuật không cần phải chỉ định virtual. Nếu phương thức cơ sở là ảo thì C++ sẽ tự động thực hiện phương thức ghi đè phù hợp virtual.

Tuy nhiên, bạn nên đánh dấu chúng virtual. Phương pháp này là virtual sau khi tất cả và nó làm cho mã của bạn rõ ràng hơn và dễ dàng hơn để làm theo bởi các nhà phát triển khác.

+0

Nhiều câu trả lời hay tại đây. Tôi chọn lựa phổ biến nhất :) Cảm ơn tất cả các bạn. – ereOn

6

Ảo được tự động chọn lên ghi đè phương pháp có nguồn gốc bất kể bạn có chỉ định nó trong lớp con hay không.

Hậu quả chính là không xác định ảo ở trẻ, khó có thể thấy từ định nghĩa lớp con rằng phương pháp này thực tế là ảo. Vì lý do này, tôi luôn chỉ định ảo trong cả lớp cha và con.

8

You do not need it, nhưng đánh dấu nó để có thể làm cho mã của bạn rõ ràng hơn.

Lưu ý: nếu lớp cơ sở của bạn có số hủy ảo , thì hàm hủy của bạn là tự động ảo. Bạn có thể cần một destructor rõ ràng cho các lý do khác , nhưng không cần phải redeclare một destructor chỉ đơn giản là để làm cho chắc chắn nó là ảo. Cho dù bạn khai báo nó với từ khóa ảo, hãy khai báo từ khóa đó mà không có từ khóa ảo hoặc không khai báo nó , nó vẫn là ảo.