版权声明:转载请注明作者和出处。 https://blog.csdn.net/LQMIKU/article/details/79368244
继承中的同名static静态变量
- 继承中的同名变量
- 继承中的static静态变量
- 继承中的同名static静态变量
- 总结
阅读之前注意:
本文阅读建议用时:35min
本文阅读结构如下表:
项目 | 下属项目 | 测试用例数量 |
---|---|---|
继承中的同名变量 | 无 | 1 |
继承中的static静态变量 | 无 | 0 |
继承中的同名static静态变量 | 无 | 1 |
总结 | 无 | 0 |
继承中的同名变量
对于继承中的同名变量,比如对于下面的代码:
#include"iostream"
using namespace std;
class base
{
public:
int a, b;
};
class derived:public base
{
public:
int b, c;
};
void main()
{
derived d;
d.a = 1;
d.base::b = 2;//访问基类中的b
d.b = 3;
d.c = 4;
}
C++编译器在内存中会按下图规则处理:
继承中的static静态变量
如果是基类中的static静态变量,则由基类及其派生类所共享。
如果是派生类类中的static静态变量,则只能从派生类访问或者从派生类的派生类访问。
继承中的同名static静态变量
如果派生类中也定义了一个和基类中重名的static静态变量,那么两个静态变量都在静态区有自己的地址,而由继承中的同名变量处理规则可以知道,直接由派生类访问时(没有加域作用符),这个静态变量会屏蔽掉基类的同名成员。
具体参考以下代码:
#include"iostream"
using namespace std;
class parent
{
public:
parent()
{
cout << "parent a=" << a << endl;
cout << "parent &a=" << &a << endl;
}
static int a;//父类中的静态变量
private:
};
int parent::a = 1;//这句话很重要:为静态变量开辟了内存空间
class child : public parent
{
public:
child()
{
cout << "child a=" << a << endl;
cout << "child &a=" << &a << endl;
}
static int a;//子类中的静态变量(与父类中的重名)
private:
};
int child::a = 2;//这句话很重要:为静态变量开辟了内存空间
void main()
{
child c1;
cout << "child c1.a=" << c1.a << endl;
cout << "child::a=" << child::a << endl;
cout << "parent::a=" << parent::a << endl;
system("pause");
}
运行结果如下图所示:
总结
本篇博客的核心是:子类中的和父类中同名的static静态变量在静态区有自己的内存,由子类直接访问时,会屏蔽掉从父类继承来的静态变量。