flownt got it right, nhưng tôi muốn chỉ ra rằng trong trận chung kết C++ 11 dự thảo (N3337), ngôn ngữ tương ứng đã chuyển sang phần 10,3 # 16:
Một chức năng với một định nghĩa xóa thì không ghi đè hàm không có định nghĩa đã xóa. Tương tự, hàm không có định nghĩa đã xóa sẽ không ghi đè hàm có định nghĩa đã xóa. 2
Có vẻ như khá rõ ràng với tôi (phần 8.4.3 # 1) rằng một xóa nét nào trong thực tế được tính là một định nghĩa , và trong thực tế một định nghĩa inline, có nghĩa là định nghĩa đã xóa thỏa mãn 10.3 # 11:
Hàm ảo được khai báo trong một lớp phải được xác định hoặc khai báo trong lớp đó hoặc cả hai; nhưng không cần chẩn đoán. 2
Tuy nhiên, có vẻ như các triển khai hiện tại không đồng ý. Đây là trường hợp thử nghiệm của tôi:
struct Base {
virtual void bar();
virtual void foo() = delete;
};
void Base::bar() { } // a definition of the first non-inline virtual function
int main() { Base b; }
Clang sản xuất một chương trình unlinkable: Base::foo
được đề cập trong vtable cho Base
. Và nếu bạn hoán đổi thứ tự của foo
và bar
, trình liên kết than phiền rằng toàn bộ vtable bị thiếu (vì Clang nghĩ rằng foo
là một hàm không phải là nội tuyến không có định nghĩa). I filed this as a bug; chúng ta sẽ thấy những gì các nhà phát triển nghĩ.
GCC than phiền về việc "sử dụng" số foo
ở cuối đơn vị dịch, khi nó tạo ra vtable; nhưng nó xác định chính xác bar
là hàm thành viên ảo không nội dòng đầu tiên, bất kể thứ tự của foo
và bar
.
@GMan Tôi đồng ý rằng có thể không có lý do chính đáng nào nhưng đề xuất dường như cho phép rõ ràng. – flownt
@flownt: Rất tiếc, xin lỗi. :) Đã xóa trên bạn. – GManNickG
Nó có tác dụng tạo ra RTTI hay không. Tương đương trong C++ hiện tại là có một destructor ảo rỗng? –