这是我的代码 -
#include <iostream>
#include <conio.h>
using namespace std;
class Base
{
public:
int a;
};
//int Base::a = 5;
class Derived : public Base
{
public:
int static a;
};
int main()
{
Derived d;
cout<<d.a;
getch();
return 0;
}
我在这里收到链接器错误。但是,当我以相反的方式做到这一点时 -
class Base
{
public:
int static a;
};
int Base::a = 5;
class Derived : public Base
{
public:
int a;
};
我没有错误。有人可以解释这里发生的事情。
答案 0 :(得分:6)
必须在类外明确定义/初始化所有静态成员。
在第二个示例中,您正确执行此操作(int Base :: a = 5),但在第一个示例中,您不对Derived :: a执行此操作,在第一个示例中添加以下行应解决它:
int Derived::a = 5;
答案 1 :(得分:2)
您需要实际定义静态成员。和你一样
int Base::a = 5
在第二种情况下你应该做的
int Derived::a = 5;
在第一种情况下。
答案 2 :(得分:1)
这里有两个问题。 第一个是为什么在第一个例子中出现链接器错误? 好吧,在第一个例子中你得到一个链接器错误,因为你没有定义/初始化类B的静态成员。
第二个问题是为什么编译器不抱怨多个声明? 编译器不会抱怨多个声明,因为就它而言,这两个变量在不同的范围内,并且它们的错位名称无论如何都会有所不同。这与其中一个静态变量无关。实际上,静态成员甚至都没有继承。因此,以下没有静态变量的代码片段也是正确的:
class B {
public:
int a;
};
class C: public B {
public:
int a;
};