[英]Forward declaration as struct vs class
我在一个类的 C++ 前向声明中发现了一个错误,它被错误地声明为struct Book
而不是class Book
。 我认为 Book 曾经是一个结构体,被更改为一个类,但前向声明仍然存在。
书.h:
class Book {
...
};
图书馆.h:
struct Book;
class Library {
std::vector<Book*> books;
};
没有编译器警告,生成的程序似乎运行良好。 这让我很好奇:理论上,这会导致问题吗? 它只是一个指针,是的,但是例如,如果类有虚方法、多重继承,指针会不同吗?
我知道关于默认公共/私有的类/结构之间的差异,但我特别询问了前向声明和交换它们的可能后果。
更新较新版本的 Xcode 现在在不匹配时发出此警告:
Struct 'Book' was previously declared as a class; this is valid, but may result in linker errors under the Microsoft C++ ABI
就前向声明而言, struct
和class
是完全可以互换的。 即使对于定义,它们也只影响对象成员的默认访问说明符,其他一切都是等价的。 您总是定义对象的“类”。
必须在class
上使用struct
的唯一地方是前向声明c绑定的不透明数据时。
关于您的编辑:
我知道关于默认公共/私有的类/结构之间的差异,但我特别询问了前向声明和交换它们的可能后果。
Visual C++ 产生警告C4099 。 它做到了,因为其函数的名称修饰包含了您使用的关键字。 因此,程序可能无法正确链接。 因此,在使用 VC++ 时,完全符合标准的代码可能无法链接(微软的一个笨蛋举动,AFAIC)。
可以在此处找到有关此警告的讨论,以及如果您受到纪律处分可以忽略它的原因
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.