注册 登录
编程论坛 C++教室

static成员能否被继承?

newyj 发布于 2008-06-06 17:05, 8040 次点击
如题!
21 回复
#2
中学者2008-06-06 19:26
#3
Ethip2008-06-06 21:06
回复 1# newyj 的帖子
如果再加上private,肯定不行...

static变量和方法只能用类名来访问。
#4
aipb20072008-06-07 05:00
试验下就知道了
#5
CPlusPlusheart2008-06-07 08:16
能能能能
#6
zjl1382008-06-07 15:37
For example:
#include <iostream>
using namespace std;

class Base
{
   public:
   static int a;
   static void Fun( )
   {
       cout<<"静态成员函数可以被继承!"<<endl;
   }
};
int Base::a=1000;

class Derived:public Base
{

};
int main(void)
{
  cout <<"静态数据成员可以被继承!  "<<Derived::a<<endl;
  Derived::Fun( );
  system("pause");
  return 0;
}
#7
newyj2008-06-07 17:19
谢谢各位的回答!
#8
janevans2008-06-09 15:06
static继承下来的,从基类到派生类只保存一份数据,,是共享的,通常用来基类和派生类之间的联系
#9
东方印2008-06-09 20:21
请问3# Ethip
[bo][un]Ethip[/un] 在 2008-6-6 21:06 的发言:[/bo]

如果再加上private,肯定不行...

static变量和方法只能用类名来访问。

staitc变量和方法为什么只能用类名来访问?虽然这种变量和方法是独立存在的,即没有和具体实例进行绑定,但也是允许通过实例名来访问的。
#10
VanHorn2008-06-09 20:48
我发现个现象。在main函数外面初始化Base的私有成员变量a是可以的。比如:



#include <iostream>
using namespace std;

class Base
{
private:
    static int a;
public:

    static void Fun( )
    {
        cout<<"静态成员函数可以被继承!"<<endl;
        a++;
        cout<<"第"<<a<<"次被调用"<<endl;
    }
};


class Derived:public Base
{
    
};

int Base::a=0; //比如这个样子

int main(int argc, char* argv[])
{

 
    int b=1;
    
    while (b)
    {
        
        Derived::Fun( );
        cout <<"是否继续?退出输入0  "<<endl;
        cin>>b;
    }
    
    
    return 0;

}

但是在main函数里面初始化基类的静态成员函数却不可以。比如:
#include "stdafx.h"

#include <iostream>
using namespace std;

class CbaseClass
{
private:
    static int a;
public:

    static void Fun( )
    {
        cout<<"静态成员函数可以被继承!"<<endl;
        a++;
        cout<<"第"<<a<<"次被调用"<<endl;
    }
};


class CDerived:public CbaseClass
{
    
};


int main(int argc, char* argv[])
{

         CbaseClass::a=0; //在主函数这里初始化,编译是没有问题的,但却在连接时出错。

    int b=1;
    
    while (b)
    {
        
        CDerived::Fun( );
        cout <<"是否继续?退出输入0  "<<endl;
        cin>>b;
    }
    
    
    return 0;

}

这是为什么呢?

我用的编译器是VC6 with sp6
错误信息是:
error LNK2001: unresolved external symbol "public: static int CbaseClass::a" (?a@CbaseClass@@2HA)
[[it] 本帖最后由 VanHorn 于 2008-6-9 21:11 编辑 [/it]]

[[it] 本帖最后由 VanHorn 于 2008-6-9 21:14 编辑 [/it]]
#11
sunkaidong2008-06-09 20:52
Base::  这个用在类后面是表示作用域。。一般用在cpp文件中。。表示和在类体里面没有区别。。
#12
VanHorn2008-06-10 12:16
说是没区别。但是用起来实现不了。不信你试试。在VC6中就是有区别。在主函数里初始化静态成员就是不行。非要在主函数外面初始化。
#13
sunkaidong2008-06-10 12:58
当然有区别,必须在类使用前把类体定义全了。。要不然怎么初始化?必须放在外面。。你看看编译原理吧
#14
sunkaidong2008-06-10 13:29
类作为一种数据结构。我是把当成一般数据结构理解的。。放在外面是定义表示全局的数据类型。。。即使是main()函数也是函数,在里它里面定义得类是局部的。。你把类定义为全局,那么必须都是全局的。。静态的初始化也必须是全局的。。你可以看看它报的错误。。

[[it] 本帖最后由 sunkaidong 于 2008-6-10 13:34 编辑 [/it]]
#15
VanHorn2008-06-10 14:39
喔?还有这种说法。可是我包含头文件了啊。那我想在main函数里初始化这个静态成员该怎么做呢?
下面的附件是我实验的工作空间。还请楼上的示范一个来看看。
#16
sunkaidong2008-06-10 15:14
你只是要表述一个继承的概念和必那么麻烦

#include "stdafx.h"

#include "iostream"

#include "baseClass.h"

#include "Derived.h"
using namespace std;


int CbaseClass ::a=0;
int main(int argc, char* argv[])
{

 
    int b=1;
    

    while (b)
    {
        CDerived::Fun( );
        
        cout <<"是否继续?退出输入0  "<<CDerived::a<<endl;
        cin>>b;
    }
    
    
    return 0;

}
int CDerived::a=0;这个也是可以的我用vs2005只是会警告
#17
sunkaidong2008-06-10 15:24
虽然静态成员在类里面声明但是其实它就只有一个地址空间。。int CbaseClass ::a=0;这个是分配地址空间的。。虽然只有一份,原则上在哪初始化都是一样。。但是要考虑一个问题。。要注意一个问题。。要是在你派生类声明之前,基类如果有实例怎么办?所以会有警告。。在main里面也是同样道理。。如果在你int CbaseClass ::a=0;之前如果有使用怎么办?其实如果编译器做的以后估计也可以支持。。当然会很麻烦。。

[[it] 本帖最后由 sunkaidong 于 2008-6-10 15:34 编辑 [/it]]
#18
VanHorn2008-06-10 19:33
我知道你在16楼的做法,这是可以的。但是如果:
int main(int argc, char* argv[])
{


    int b=1;
     CbaseClass ::a=0;//我在主函数中初始化呢?


    while (b)
    {
        CDerived::Fun( );
        
        cout <<"是否继续?退出输入0  "<<CDerived::a<<endl;
        cin>>b;
    }
   
   
    return 0;

}
在主函数中初始化静态变量,书上教的这么弄可以。编译也不报错,但是连接的时候就报错了。
#19
sunkaidong2008-06-10 20:08
可以吗?好像不可以。。作为全局数据类型。我觉得还是放在外面初始化比较好。。放在里面会异常的。。你在考察编译器的健壮性。。就当概念记住吧。。
#20
VanHorn2008-06-10 20:36
哈哈,楼上的真幽默,就当是个概念记住吧。
#21
kongwei2542008-06-29 16:13
铁定能
#22
wangfangjin2010-10-11 14:05
因为static数据成员必须在类定义体的外部进行初始化(正好一次)。
1