一、子类有同名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();
}
运行结果: