继承和静态变量

时间:2010-05-20 06:59:49

标签: c++

这是我的代码 -

#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;
};

我没有错误。有人可以解释这里发生的事情。

3 个答案:

答案 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;
};