代码之家  ›  专栏  ›  技术社区  ›  Bruce

继承和静态变量

c++
  •  1
  • Bruce  · 技术社区  · 15 年前

    这是我的密码-

    #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 回复  |  直到 15 年前
        1
  •  6
  •   Patrick    15 年前

    必须在类外部显式定义/初始化所有静态成员。

    在第二个示例中,您可以正确地执行此操作(in t base::a=5),但在第一个示例中,对于派生::a不执行此操作,在第一个示例中添加以下行应该可以解决此问题:

    int Derived::a = 5;
    
        2
  •  2
  •   sharptooth    15 年前

    您需要实际定义静态成员。和你一样

    int Base::a = 5
    

    在第二种情况下,你应该这样做

    int Derived::a = 5;
    

    在第一种情况下。

        3
  •  1
  •   341008 Sylvain    15 年前

    这里有两个问题。 第一个是为什么在第一个示例中会出现链接器错误? 在第一个示例中,您会得到一个链接器错误,因为您没有定义/初始化类B的静态成员。

    第二个问题是为什么编译器不抱怨多个声明? 编译器不会抱怨多个声明,因为就其而言,这两个变量在不同的作用域中,它们的损坏名称无论如何都会不同。这与其中一个变量是静态的无关。实际上,静态成员甚至不会被继承。因此,以下没有静态变量的代码段也是正确的:

    class B {
    public:
    int a;
    };
    
    class C: public B {
    public:
    int a;
    };