【发布时间】:2014-07-07 22:56:47
【问题描述】:
我基本看不懂clang的-Wweak-vtables。以下是我目前观察到的:
案例一:(触发警告)
class A {
public:
virtual ~A(){}
};
class B : public A {
public:
virtual ~B(){}
};
int main(){}
案例二:(不触发警告)
class A {
public:
virtual ~A(){}
};
int main(){}
案例三:(不触发警告)
class A {
public:
virtual ~A();
};
A::~A(){}
class B : public A {
public:
virtual ~B(){}
};
int main(){}
案例四:(触发警告)
class A {
public:
virtual ~A(){}
virtual void fun(){}
};
class B : public A {
public:
virtual ~B(){}
};
int main(){}
案例五:(不触发警告)
class A {
public:
virtual ~A(){}
virtual void fun();
};
class B : public A {
public:
virtual ~B(){}
};
int main(){}
案例六:(不触发警告)
class A {
public:
virtual ~A(){}
virtual void fun(){}
};
class B : public A {};
int main(){}
案例七:(不触发警告)
class A {
public:
virtual ~A(){}
virtual void fun(){}
};
class B : public A {
public:
virtual void fun(){}
};
int main(){}
确切的警告是
warning: 'A' has no out-of-line virtual method definitions; its vtable
will be emitted in every translation unit [-Wweak-vtables]
显然,如果我不在一个类中声明一个非内联虚函数,它会导致一些 当且仅当我从它派生并且派生类具有虚拟析构函数时才会出现这种问题。
问题:
- 为什么会出现这个问题?
- 为什么通过声明虚函数来解决这个问题? (警告说 定义)
- 为什么当我不是从类派生时不会出现警告?
- 为什么派生类没有虚拟析构函数时不会出现警告?
【问题讨论】: