2013-06-26 50 views
6

Trong mã này:Chức năng ảo có thể bị ghi đè bởi một chức năng phi ảo không?

class Base { 
public: 
    virtual void method() = 0; 
}; 

class Derived1 : public Base{ 
public: 
    virtual void method() override { } 
}; 

class Derived2 : public Base{ 
public: 
    void method() override { } 
}; 

Có sự khác biệt giữa Derived1Derived2?

+3

'Derived2 :: method2' là ảo. –

+0

nếu cú ​​pháp cho phép. (không được chọn) thì phương thức 'derived2->()' cũng sẽ là ảo (mặc dù ngầm) – Alex

+0

@ R.MartinhoFernandes: Vì vậy, từ khóa ảo được ngụ ý? – Eric

Trả lời

16

Từ phần 10,3 chức năng ảo của C++ 11 tiêu chuẩn (dự thảo n3337) chỉ 2:

Nếu một ảo chức năng thành viên vf được khai báo trong một lớp học cơ sở và trong một lớp học có nguồn gốc, xuất phát trực tiếp hoặc gián tiếp từ Base, một hàm thành viên vf có cùng tên, tham số-type-list (8.3.5), cv-qualification và refqualifier (hoặc vắng mặt) như Base :: vf được khai báo, rồi Có nguồn gốc :: vf cũng là ảo (cho dù đó có phải là được khai báo) và nó ghi đè Base :: vf.

Vì vậy, Derived2::method cũng là virtual, mặc dù nó không được khai báo rõ ràng như vậy.

+0

Có bao giờ mong muốn khai báo thành viên mà không có từ khóa ảo không? GCC có thể tạo ra một cảnh báo khi điều đó xảy ra không? – Eric

+0

@Eric: Một số người cho rằng đánh dấu hàm ảo bắt nguồn đóng vai trò là tài liệu, một số khác cho rằng đó là bloat mã không cần thiết. Trong thực tế nó không thực sự quan trọng trong cả hai cách. –

+4

Với C++ 11, người ta có thể sử dụng từ khóa ghi đè để chỉ ra rằng một hàm trong lớp dẫn xuất là ảo. –

4

Chúng giống hệt nhau.

virtual là tùy chọn khi thực sự ghi đè hàm. Nó chỉ bắt buộc khi đánh dấu một hàm trong lớp cơ sở.

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