Về cơ bản tôi không hiểu clang's -Wweak-vtables
. Đây là những gì tôi quan sát được cho đến nay:
Trường hợp một: (kích hoạt cảnh báo)
class A {
public:
virtual ~A(){}
};
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Trường hợp hai: (Không kích hoạt cảnh báo)
class A {
public:
virtual ~A(){}
};
int main(){}
Trường hợp ba: (Không kích hoạt cảnh báo)
class A {
public:
virtual ~A();
};
A::~A(){}
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Trường hợp bốn: (Cảnh báo kích hoạt)
class A {
public:
virtual ~A(){}
virtual void fun(){}
};
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Trường hợp năm: (Không kích hoạt cảnh báo)
class A {
public:
virtual ~A(){}
virtual void fun();
};
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Trường hợp sáu: (Không kích hoạt cảnh báo)
class A {
public:
virtual ~A(){}
virtual void fun(){}
};
class B : public A {};
int main(){}
Trường hợp bảy: (Không kích hoạt cảnh báo)
class A {
public:
virtual ~A(){}
virtual void fun(){}
};
class B : public A {
public:
virtual void fun(){}
};
int main(){}
Cảnh báo chính xác là
warning: 'A' has no out-of-line virtual method definitions; its vtable
will be emitted in every translation unit [-Wweak-vtables]
Vì vậy, rõ ràng, nếu tôi không khai báo một hàm ảo không nội tuyến trong một lớp, nó sẽ gây ra một số loại vấn đề nếu và chỉ khi tôi bắt nguồn từ nó và lớp dẫn xuất có một hàm hủy ảo.
Câu hỏi:
- Tại sao điều này là một vấn đề?
- Tại sao điều này được khắc phục bằng cách khai báo một hàm ảo? (Cảnh báo nói về định nghĩa)
- Tại sao cảnh báo không xảy ra khi tôi không xuất phát từ lớp?
- Tại sao cảnh báo không xảy ra khi lớp dẫn xuất không có trình hủy ảo?