[Tất cả những điều sau đây đã được thử nghiệm sử dụng Visual Studio 2008 SP1]C++ so với C++/CLI: trình độ chuyên môn Const chức năng ảo thông số
Trong C++, trình độ const các loại tham số không ảnh hưởng đến các loại của một hàm (8.3.5/3: "Bất cứ cv-vòng loại thay đổi một kiểu tham số này sẽ bị xóa")
vì vậy, ví dụ, trong hệ thống phân cấp lớp sau, Derived::Foo
ghi đè Base::Foo
:
struct Base
{
virtual void Foo(const int i) { }
};
struct Derived : Base
{
virtual void Foo(int i) { }
};
Xem xét một hệ thống cấp bậc tương tự trong C++/CLI:
ref class Base abstract
{
public:
virtual void Foo(const int) = 0;
};
ref class Derived : public Base
{
public:
virtual void Foo(int i) override { }
};
Nếu tôi sau đó tạo ra một thể hiện của Derived
:
int main(array<System::String ^> ^args)
{
Derived^ d = gcnew Derived;
}
nó biên dịch mà không có lỗi hoặc cảnh báo. Khi tôi chạy nó, nó ném ngoại lệ sau đây và sau đó chấm dứt:
An unhandled exception of type 'System.TypeLoadException' occurred in ClrVirtualTest.exe
Additional information: Method 'Foo' in type 'Derived'...does not have an implementation.
ngoại lệ Đó dường như chỉ ra rằng trình độ const của tham số không ảnh hưởng đến kiểu của hàm trong C++/CLI (hoặc, ít nhất nó ảnh hưởng đến trọng số theo một cách nào đó). Tuy nhiên, nếu tôi nhận xét ra các dòng có chứa các định nghĩa của Derived::Foo
, trình biên dịch báo cáo lỗi sau (trên dòng trong main
nơi thể hiện của Derived
được khởi tạo):
error C2259: 'Derived': cannot instantiate abstract class
Nếu tôi thêm các vòng loại const đến tham số của Derived::Foo
hoặc xóa vòng loại const khỏi tham số Base::Foo
, nó biên dịch và chạy không có lỗi.
Tôi nghĩ rằng nếu trình độ const của tham số ảnh hưởng đến loại hàm, tôi sẽ gặp lỗi này nếu trình độ const của tham số trong hàm lớp ảo có nguồn gốc không khớp với trình độ const của tham số trong hàm ảo lớp cơ sở.
Nếu tôi thay đổi kiểu của tham số Derived::Foo
's từ một int
đến một double
, tôi nhận được những điều sau đây cảnh báo (ngoài các lỗi nói trên, C2259):
warning C4490: 'override': incorrect use of override specifier; 'Derived::Foo' does not match a base ref class method
Vì vậy, câu hỏi của tôi là, hiệu quả, liệu trình độ const của các tham số chức năng có ảnh hưởng đến loại hàm trong C++/CLI không? Nếu vậy, tại sao điều này biên dịch và tại sao không có lỗi hoặc cảnh báo? Nếu không, tại sao là một ngoại lệ ném?
Cập nhật: Tôi đã báo cáo lỗi này trên Microsoft Connect: https://connect.microsoft.com/VisualStudio/feedback/details/540788 (Tôi đã sao chép liên kết đến đây từ cuộc thảo luận dưới đây vì nó đã được chôn cất trong cuộc hội thoại) –
Thành viên nhóm biên dịch Microsoft C++/CLI đã xác nhận là vào ngày 21 tháng 3 rằng đó là lỗi và họ đang khám phá tác động của bản sửa lỗi trên mã hiện có. –
@Ben: Cảm ơn. Lỗi mà tôi đã gửi trên Microsoft Connect đã bị đóng hôm nay là "không khắc phục được". "Xin chào: cảm ơn vì đã báo cáo vấn đề này. Thật không may dựa trên phân tích của chúng tôi về mức độ nghiêm trọng của vấn đề này kết hợp với các lần giới hạn của chúng tôi, chúng tôi sẽ không thể khắc phục vấn đề này trong bản phát hành tiếp theo của Visual C++." Oh well :-) –