C++学习-对类继承中同名变量或函数的学习与思考
对类继承中同名变量或函数的学习与思考
派生类如果有与直接基类同名变量或函数(不论访问控制关键字是否相同),对于同名变量,其会覆盖直接基类对应的同名变量变量。(下面会讲到"覆盖"一词并不准确,个人深受其害)
对于同名函数,则覆盖直接基类对应同名的所有函数,包括所有重载。也就是一个派生类的直接基类和间接基类,它们之间不可能形成函数重载。
如:
#include<iostream>
using namespace std;
class A
{
protected:
char a='A';
public:
void show(char a)
{
cout<<a;
}
};
class B:public A
{
public:
void show(int b)
{
cout<<b;
}
void show()
{
cout<<'B';
}
};
class C:public B
{
public:
void show()
{
cout<<'C';
}
};
int main()
{
C c;
c.show(2);
return 0;
}
编译会出错。
但是,被覆盖掉的变量或函数,仍然可以通过作用域解析运算符(::)来调用
。如果对以上代码的类 C 和 main 函数进行如下改动:
class C:public B
{
public:
void show()
{
A::show(A::a);
cout<<endl;
B::show();
cout<<endl;
cout<<'C';
}
};
int main()
{
C c;
c.show();
return 0;
}
则输出为
A
B
C
所以直接说派生类的同名函数会"覆盖"基类里的同名函数不负责任的说法,更确切的说法是"隐藏",因为没有实际消失。
既然没有实际消失,如果没有出现同名隐藏,那么派生类所继承的基类中的函数能访问的成员的永远只能是它所在的类和它所在类的所有基类(直接基类和间接基类)内的成员,不会出现基类函数访问派生类成员的情况。
如果虚函数同名,我们不考虑虚函数和非虚函数同时存在于一个类中且同名的情况,实际程序设计用不上(个人想法),所以如果只考虑虚函数存在,对于虚函数重载,拥有和非虚函数一样的同名隐藏。但是虚函数重载中,如果函数原型不完全相同,那么不能认为给一个函数前面加了virtual所有同名函数(基类和所有派生类中)都是虚函数,必须得在每个不同原型首次出现的位置添加virtual。
例子不举了。
建议了解虚函数表。