我基本上不懂clang的-Wweak-vtables.这是我到目前为止所观察到的:
案例一:(触发警告)
class A {
public:
virtual ~A(){}
};
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Run Code Online (Sandbox Code Playgroud)
案例二:(不触发警告)
class A {
public:
virtual ~A(){}
};
int main(){}
Run Code Online (Sandbox Code Playgroud)
案例三:(不触发警告)
class A {
public:
virtual ~A();
};
A::~A(){}
class B : public A {
public:
virtual ~B(){}
};
int main(){}
Run Code Online (Sandbox Code Playgroud)
案例四:(触发警告)
class A {
public:
virtual ~A(){}
virtual void fun(){}
};
class B : public A {
public:
virtual ~B(){}
};
int …Run Code Online (Sandbox Code Playgroud) 如何在Qt中维护窗口小部件的宽高比以及如何使窗口小部件居中呢?
关于此主题的先前问题:
这是我最近提出的问题的后续跟进: clang:没有外线虚拟方法定义(纯抽象C++类) ,并且被标记为此问题的副本:clang的-Wweak-含义是什么?虚函数表?.我不认为那回答了我的问题,所以在这里我专注于困扰我的事情,但尚未得到回答.
我的情景:
我正在尝试使用Clang-3.5编译以下简单的C++代码:
test.h:
class A
{
public:
A();
virtual ~A() = 0;
};
Run Code Online (Sandbox Code Playgroud)
test.cc
#include "test.h"
A::A() {;}
A::~A() {;}
Run Code Online (Sandbox Code Playgroud)
我用来编译它的命令(Linux,uname -r:3.16.0-4-amd64):
$clang-3.5 -Wweak-vtables -std=c++11 -c test.cc
Run Code Online (Sandbox Code Playgroud)
而我得到的错误:
./test.h:1:7: warning: 'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]
Run Code Online (Sandbox Code Playgroud)
当A类不是纯抽象时,上面的代码构建得很好.以下代码不会发出警告,唯一的变化是A类不再是抽象的:
test2.h:
class A
{
public:
A();
virtual ~A();
};
Run Code Online (Sandbox Code Playgroud)
test2.cc
#include "test2.h"
A::A() {;}
A::~A() {;}
Run Code Online (Sandbox Code Playgroud)
我的问题
上面的代码在Clang中触发警告的纯抽象类有什么特别之处?
Object.hpp:
class Object
{
public:
virtual ~Object();
};
Run Code Online (Sandbox Code Playgroud)
Object.cpp:
#include "Object.hpp"
Object::~Object()
{
}
Run Code Online (Sandbox Code Playgroud)
我们来编译它:
>clang++ -v
clang version 3.9.0 (branches/release_39)
Target: x86_64-pc-windows-msvc
Thread model: posix
>clang++ -Weverything -c Object.cpp
In file included from Object.cpp:1:
./Object.hpp:1:7: warning: 'Object' has no out-of-line virtual method definitions;
its vtable will be emitted in every translation unit [-Wweak-vtables]
class Object
^
1 warning generated.
Run Code Online (Sandbox Code Playgroud)
但是Object确实有一个外联的虚拟方法,为什么Clang会产生这个警告呢?
根据此答案,在C ++中从概念上类似于接口的方式声明类的方法如下:
class IDemo
{
public:
virtual ~IDemo() {}
virtual void OverrideMe() = 0;
};
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,会收到警告:'IDemo' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit。是否有适当的方法在项目中使用此类接口而不用这些vtable污染每个翻译单元?
c++ ×4
clang ×3
aspect-ratio ×1
clang++ ×1
inheritance ×1
interface ×1
llvm-clang ×1
pure-virtual ×1
qt ×1
widget ×1