Có cần thiết phải có định nghĩa cho một chức năng ảo không?Một chức năng ảo về cơ bản có định nghĩa không?
xem xét chương trình mẫu này dưới đây:
#include <iostream>
using namespace std;
class base
{
public:
void virtual virtualfunc();
};
class derived : public base
{
public:
void virtualfunc()
{
cout << "vf in derived class\n";
}
};
int main()
{
derived d;
return 0;
}
này cung cấp cho các liên kết lỗi:
In function
base::base()
:: undefined reference tovtable for base
Tôi không có định nghĩa cho hàm ảo trong lớp cơ sở. Tại sao lỗi này xảy ra mặc dù tôi đã không gọi hàm ảo một cách rõ ràng?
Điều thú vị mà tôi thấy là nếu tôi không khởi tạo đối tượng của lớp derived
, lỗi liên kết sẽ không còn ở đó nữa. Tại sao điều này? Điều gì đã instantiation đã làm với các lỗi liên kết ở trên?
Chỉnh sửa lại: nếu bạn không khởi tạo một 'nguồn gốc' hoặc' cơ sở', tại sao trình liên kết phải làm bất kỳ điều gì với bất kỳ phương thức nào từ hai lớp đó? Nếu các lớp không được tham chiếu, trình liên kết không có lý do gì để thậm chí cố tìm chúng trong các tệp đối tượng. (Trừ khi bạn đang xây dựng một thư viện.) – Mat
@Mat: Tôi đồng ý :) –