Tôi đã cố gắng "sửa" ví dụ trong số this answer để minh họa cách một chức năng ảo thuần túy có thể được gọi.Tại sao đây không phải là một cuộc gọi của một chức năng ảo thuần túy?
#include <iostream>
using namespace std;
class A
{
int id;
public:
A(int i): id(i) {}
int callFoo() { return foo(); }
virtual int foo() = 0;
};
class B: public A
{
public:
B(): A(callFoo()) {}
int foo() { return 3; }
};
int main() {
B b; // <-- this should call a pure virtual function
cout << b.callFoo() << endl;
return 0;
}
Nhưng tôi nhận được không có lỗi runtime here (with C++ 4.9.2), nhưng sản lượng 3. Tôi đã cố gắng cùng với Borland C++ 5.6.4, nhưng có tôi nhận được một vi phạm truy cập. Tôi nghĩ rằng foo()
nên được tinh khiết ảo trong cuộc gọi của các nhà xây dựng của lớp cơ sở.
Ai là người sai? Tôi có nên thử nhiều trình biên dịch hơn không? Tôi có đúng trong sự hiểu biết của tôi về các chức năng ảo không?
Tôi sẽ không sử dụng kết quả thử nghiệm với Borland C++ để xem đoạn mã có hợp lệ hay không hoặc tuân thủ tiêu chuẩn;) – CoryKramer
@CoryKramer Các chức năng ảo đang được sử dụng trong nhiều thập kỷ nay. – Wolf
Tôi nhận thức được điều đó, tôi đã thực hiện một nhận xét táo bạo về một người vẫn đang sử dụng Borland IDEs – CoryKramer