静态成员和方法的继承问题

一、子类有同名static函数

#include <iostream>using namespace std;class base{
public:
static void show() 
{cout<<"static base show()::a"<<a<<endl;}
static int a ;
};
int base::a = 10;
class derive: public base
{
public: static void show(int b = 1)
{cout<<"static derive show()::a"<<a<<endl;}
static int a;
};
int derive::a = 20;
int main()
{
base a;
a.a = 11; 
a.show();
derive b;
b.a = 22;
b.show();
base* p = &b;
p->a = 21;
p->show();
base::show();
derive::show();
}

这样实现和我们普通的继承一样,没有什么出现什么特殊的情况,当子类中有重名的函数时,我们的子类会将父类的同名show影藏起来。
运行结果:

二、将基类实现为虚函数
    将父类实现为虚函数,我们看看静态成员变量是不是还是影藏的关系,看看这种情况下,会不会实现多态。
#include <iostream>
using namespace std;

class base
{
public:
	virtual void show()
	{
		cout<<"virtual base show()::a"<<a<<endl;
	}
	static int a ;
};

int base::a = 10;
class derive: public base
{
public:
	static void show()
	{
		cout<<"static derive show()::a"<<a<<endl;
	}
	static int a;
};

int derive::a = 20;

int main()
{
	base a;
	a.a = 11;
    a.show();
	
	derive b;
	b.a = 22;
	b.show();

	base* p = &b;
	p->a = 21;
	p->show();

	cout<<"-------------------------"<<endl;
	a.show();
	derive::show();
}
我们将父类的show函数实现为虚函数,然后子类的show如果按照普通函数的现象应该时会被同名的函数覆盖,那么就会发生多态,也就是说我们第三个打印的地方应该时派生类的show,我们看看运行结果看是不是。
运行结果:

我们会发现并没有发生多态,可见我们的加了static之后的函数它的生存周期是定义它的地方就确定了,也就是说我们无法做到运行时再去检查寄存器,通过call寄存器去实现多态,所以,可见我们static修饰的函数无法重写从而实现多态。

三、派生类中什么都不写

#include <iostream>
using namespace std;

class base
{
public:
	static void show()
	{
		cout<<"virtual base show()::a"<<a<<endl;
	}
	static int a ;
};

int base::a = 10;
class derive: public base
{

};


int main()
{
	base a;
	a.a = 11;
    a.show();
	
	derive b;
	b.a = 22;
	b.show();

	base* p = &b;
	p->a = 21;
	p->show();
}

运行结果:

通过这个我们可以证明我们static修饰的成员变量时可以被继承的。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值