C++可不可以让子类继承父类的静态成员后赋予它各自不同的值?

来源:百度知道 编辑:UC知道 时间:2024/07/01 13:10:40
我们知道,假如一个类有一个静态成员:
class Base {
public:
static int m_Num;
//...
};
有两个子类:
class Derived1 {
//...
};
class Derived2 {
//...
};
那么这两个类中的m_Num成员指向的都是同一个,也就是说如果已经有:
int Derived1::m_Num = 1;
这一句定义的话,再定义:
int Derived2::m_Num = 3;
就是错误的。
我想知道有没有这样的方法,使得不同的子类能够有不同的静态成员实例。换句话说,我想通过在基类中声明一个静态成员使得它的所有子类都有一个静态成员,但这个成员对于不同的类是不同的。这可以实现吗?

不行,这是静态成员的规则.因为没有this指针所以可以被这个类中的任何对象实例所引用

除非把这个静态成员改为动态才可实现功能。
可以在各个子类中定义它们自己的静态成员,然后给它们不同的值。如下:
#include<iostream>
using namespace std;

class Base
{
public:
static int m_Num;
//...
};

class Derived1:public Base
{
static int m_Num;
//...
};
class Derived2:public Base
{
static int m_Num;
//...
};

int Derived1::m_Num = 1;
int Derived2::m_Num = 3;

int main()
{
return 0;
}

int Derived1::m_Num = 1;
这样写本来就是不对的。不能去重定义基类的数据成员。
事实上基类的静态成员永远只有一份。
如果想要那么做,只能是非静态的。
要么就是两个派生类里都有一个同名静态成员。
当然,这在强制为基类指针时无法访问(像楼上那位那样。

还有一个绝招:
class B{
public:
virtual int Num()=0;
};
class A1{
public:
static int num;
virtual int Num(){
return num;
}
};
int A1::num=0;

class A2{
public:
static int num;
virtua