c++ - VC++ 警告 C4356 : static data member cannot be initialized via derived class

标签 c++ inheritance visual-c++ static warnings

以下代码发出此警告,但它似乎工作正常,因为 A::st 和 B::st 都已初始化并且实际上代表相同的字符串。据我了解,这是格式错误的代码,不应编译(我检查了 clang)。我想知道为什么 VC++ 不发出错误而是发出警告?

#include <string>
#include <iostream>

class A
{
public:
    static const std::string st;
};

class B : public A
{

};

const std::string B::st = "abcd"; //warning C4356: 'A::st': static data member cannot be initialized via derived class

int main()
{
    std::cout << A::st << std::endl; // outputs "abcd"
    std::cout << B::st << std::endl; // outputs "abcd"
}

最佳答案

从继承定义来看一切都很好 因为 B 是 A 加上一些额外的东西,但是想想你定义了什么! 您在类 a 中定义了一个静态常量字符串。 因为它是静态的,所以它是全局的,并且对于 A 和 B 的所有实例都是相同的。 因此,即使是 A 的直接实例也将使用“abcd”进行初始化 如果你有一个也从 A 但不是从 B 派生的 D 它将包含 abcd 并且因为它是静态的,所以您无法定义包含“abcd”的 B 和包含“efgh”的 D 我没有试过,但我很确定你会遇到一些麻烦 如果你定义

clase D :public A
{
};
const std:string d:st = "efgh";

即使编译器只发出警告,它也可能取决于链接顺序 A::st 的内容。 它可能是“abcd”或“efgh”,但 d::st 将是“abcd”或 B::st 将是“efgh” 您无法为 B 定义“abcd”,为 D 定义“efgh”,因为它是静态的。

关于c++ - VC++ 警告 C4356 : static data member cannot be initialized via derived class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36856874/

相关文章:

c++ - 在 Windows 上调试 linux 故障转储

c++ - 如何使用继承的方法和相同的基类方法?

python - 从基类调用派生类中的重写方法

.net - C++/cli 识别托管/非托管之间的转换并测量其成本

c++ - 将 bool 值更改为 0 或 1 以外的值?

visual-studio - Microsoft Visual Studio : opendir() and readdir(), 怎么办?

c++ - 使用对 vector 时出现无效、错误的数字模板参数错误

c++ - blitz 0.10 中的 blitz/tinyvec.h 在哪里?

c++ - 使用 lib.a 文件调试链接错误

java - Loop 中使用的接口(interface)实现