2016-04-26 225 views
3

下面的代码发出此警告,但它似乎工作正常,因为A :: st和B :: st都被初始化并且实际上表示相同的字符串。根据我的理解,这是错误的代码,它不应该编译(我检查铛)。我想知道为什么VC++不会发出错误而不是警告?VC++警告C4356:静态数据成员无法通过派生类初始化

#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" 
} 
+2

语言标准只是谈论发布“诊断”。它不会说如果他们被称为警告或错误(或别的东西)。 –

回答

0

从继承的定义,一切都很好 因为B是A加一些额外的东西,但一想起你定义了什么! 您在类a中定义了一个静态常量字符串。 因为它是静态它是全球性的,也将是同为因为A的,即使是直接实例A和B. 的所有实例将与“ABCD” 被初始化,如果你有一个d也从A派生,但不是从B它将包含abcd ,因为它是静态的,你不能够定义一个包含“abcd”的B和一个包含“efgh”的D我还没有尝试,但我相当肯定你会遇到一些麻烦 if你定义

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

即使编译器只告诉一个警告它可能依赖于链接顺序什么将是A :: st的内容。 它可能是“abcd”或“efgh”,但是d :: st将是“abcd”或B :: st将是“efgh”,因为您无法为B定义“abcd”而D为“efgh”,因为它是静态的。