Đây là lớp học có phương pháp chưa được xác định. Có vẻ như các trình biên dịch cho phép các cá thể của lớp này được xây dựng, miễn là hàm thành viên không xác định không bao giờ được gọi là:Có phải tất cả các phương pháp chưa được xác định chưa được sử dụng đều được phép không?
struct A {
void foo();
};
int main() {
A a; // <-- Works in both VC2013 and g++
a.foo(); // <-- Error in both VC2013 and g++
}
Đây là một tình huống tương tự, nhưng có liên quan đến kế thừa. Phân lớp Bar
mở rộng lớp cơ sở Foo
. Foo
xác định phương thức g()
. Bar
tuyên bố phương thức có cùng tên nhưng không xác định phương thức đó:
#include <iostream>
struct Foo {
void g() { std::cout << "g\n"; }
};
struct Bar : Foo {
void g();
};
int main() {
Bar b; // Works in both VC2013 and g++
b.Foo::g(); // Works in both VC2013 and g++
b.g(); // Error in both VC2013 and g++
}
Đây là một biến thể ở trên. Sự khác biệt duy nhất ở đây là g()
là virtual
cho cả Foo
và Bar
:
#include <iostream>
struct Foo {
virtual void g() { std::cout << "g\n"; }
};
struct Bar : Foo {
virtual void g();
};
int main() {
Bar b; // Works in g++. But not in VC2013, which gives
// 'fatal error LNK1120: 1 unresolved externals'
b.Foo::g(); // Works in g++, but VC2013 already failed on b's construction
b.g(); // Error in g++, but VC2013 already failed on b's construction
}
Xem các ý kiến mã cho độ tương phản của hành vi khác nhau giữa VC2013 và g ++.
- Trình biên dịch nào là chính xác, nếu có?
- Tại sao trình biên dịch VC2013 có một số khiếu nại khác nhau trong phiên bản với từ khóa
virtual
so với từ khóa trong phiên bản của từ khóa mà không có từ khóavirtual
? - Các phương pháp chưa được xác định chưa sử dụng luôn được phép không? Nếu không, tất cả các trường hợp mà chúng không được phép là ?
- Tuyên bố của
Bar
làg()
được tính là ghi đè ngay cả khiBar
không cung cấp định nghĩa?
Vtable được tham chiếu trong hàm tạo và cần địa chỉ của các hàm ảo, vì vậy lỗi VC2013 có vẻ hợp lý. – BartoszKP