开始这个问题,我在Python中发现的。先说一下python中的吧。
Python中:
class A:
count = 0
def __init__(self):
A.count += 1
class B(A):
def __init__(self):
A.__init__(self)
obj1 = A()
obj2 = A()
print('A.count:', A.count,' B.count:', B.count)
obj3 = B()
obj4 = B()
print('A.count:', A.count,' B.count:', B.count)
执行结果:
A类的构造方法中每创建一个对象count会加一。
程序中先创建基类A的对象,发现基类的类属性和派生类的类属性都count改变了。
然后创建派生类B的对象,发现基类与派生类的类属性也同时改变了。
所以,派生类和基类会共用基类的类属性。编程的时候应该注意。
也可以通过打印变量地址的方法来验证:
两个变量地址相同。
另外,直接通过派生类名来引用基类的类属性赋值,会被认为是派生类重新创建了一个类属性,而不是调用的基类属性。
C++中:
#include <iostream>
using namespace std;
class A
{
public:
A()
{
count++;
}
static int count;
};
int A::count = 0;
class B : public A
{
};
int main(void)
{
cout <<"A类静态成员变量:"<< A::count<<" B类静态成员变量:"<<B::count<< endl;
A obj1;
A obj2;
cout <<"A类静态成员变量:"<< A::count<<" B类静态成员变量:"<<B::count<< endl;
B obj3;
B obj4;
B obj5;
cout <<"A类静态成员变量:"<< A::count<<" B类静态成员变量:"<<B::count<< endl;
system("pause");
}
执行结果:
程序中定义基类的对象,发现基类和派生类的静态数据成员同步发生了改变。
然后定义B类的对象,结果还是同步改变。
加上一行代码打印两个变量的地址。
cout <<"A count:"<<&(A::count)<<" B count:"<<&(B::count)<<endl;
地址相同。
所以,在C++中基类和派生类也是共享基类的静态数据成员的。
如有不当之处,请指正。