前向声明为结构 vs class

Forward declaration as struct vs class

我在 class 的 C++ 前向声明中发现了一个错误,它被错误地声明为 struct Book 而不是 class Book。我认为 Book 曾经是一个结构,已更改为 class 但前向声明仍然存在。

Book.h:

class Book {
    ...
};

Library.h:

struct Book;

class Library {
    std::vector<Book*> books;
};

没有编译器警告,生成的程序似乎运行良好。这让我很好奇:理论上,这会导致问题吗? 它只是一个指针,是的,但是例如,如果 class 有虚方法、多重继承,指针可以不同吗?

我知道 class/struct 之间关于默认 public/private 的区别,但我特别询问前向声明和交换它们的可能后果。

UPDATE Xcode 的较新版本现在在出现不匹配时给出此警告:

Struct 'Book' was previously declared as a class; this is valid, but may result in linker errors under the Microsoft C++ ABI
就前向声明而言,

structclass 是完全可以互换的。即使对于定义,它们也只影响对象成员的默认访问说明符,其他一切都是等价的。您总是定义 "classes" 个对象。

唯一必须在 class 上使用 struct 的地方是为 绑定转发声明不透明数据时。


关于您的修改:

I know the differences between class/struct regarding default public/private but I'm asking specifically about the forward declarations and possible consequences of swapping them.

Visual C++ 产生警告 C4099。它之所以这样做,是因为其函数的名称修饰包含了您使用的关键字。因此,程序 可能 无法正确 link。因此,在使用 VC++ 时,完全符合标准的代码可能不会 link(微软方面的愚蠢举动,AFAIC)。

有关此警告的讨论,以及如果您遵守纪律可以忽略它的原因,请参见 here