关于静态成员变量在派生类中重新声明
引用自https://blog.csdn.net/digu/article/details/1837559 修改
基类和派生类都声明了同名静态成员,它们的地址是连续的,如下代码,可以通过指针偏移互相访问;
#include<iostream>
class base
{
int mx;
public:
static int xxx[];
static void fun(int x)
{
xxx[0]=x;
}
base(int x):mx(x){}
friend std::ostream& operator<<(std::ostream& ,base&);
};
int base::xxx[]={1,2,3};
class test:public base
{
public:
test(int x):base(x){}
static int xxx[];
static void fun(int x)
{
xxx[0]=x;
}
};
int test::xxx[]={4,5};
std::ostream& operator<<(std::ostream& os,base& s)
{
os<<s.mx;
return os;
}
int main()
{
test x(321);
base y(123);
std::cout<<&base::xxx[0]<<std::endl;
std::cout<<&test::xxx[0]<<std::endl;
std::cout<<base::xxx[0]<<std::endl;
std::cout<<base::xxx[1]<<std::endl;
std::cout<<base::xxx[2]<<std::endl;
std::cout<<base::xxx[3]<<std::endl;
std::cout<<base::xxx[4]<<std::endl;
std::cout<<test::xxx[-3]<<std::endl;
std::cout<<test::xxx[-2]<<std::endl;
std::cout<<test::xxx[-1]<<std::endl;
std::cout<<test::xxx[0]<<std::endl;
std::cout<<test::xxx[1]<<std::endl;
return 0;
}
输出结果: