我基本上不了解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]
因此,显然,如果我没有在类中声明非内联虚拟函数,则当且仅当我从该类派生并且派生类具有虚拟析构函数时,它才会引起某种问题。
问题:
- 为什么这是个问题?
- 为什么通过声明虚函数来解决此问题?(警告谈到定义)
- 如果我不是从班级派生的,为什么不会出现警告?
- 当派生类没有虚拟析构函数时,为什么不会出现警告?