
存在继承关系时,派生类的范围嵌套在其基类的范围内.
对象,引用或指针的静态类型确定对象的哪些成员可见. 即使静态类型和动态类型可能不一致,但我们使用的成员仍由静态类型确定. 即使基类指针(引用)指向派生类对象,即使它是公共的,您仍然无法通过该指针(引用)访问派生类中定义的成员. 编译器使用静态类型来确定调用对象在内存中占用的空间量
原因:
名称搜索和继承: (函数调用步骤)

假设调用p-> mem()
1. 首先确定p的静态类型
2. 在与p的静态类型相对应的类中搜索. 如果找不到它,则将继续在直接基类中进行搜索,直到到达继承链的顶部. 如果找到该类及其基类,则仍然找不到. 为此,编译器将报告错误
3. 找到内存后,将进行常规类型检查,以确认此调用对当前找到的内存是否合法

4. 假定该调用是合法的,则编译器根据该调用是否为虚函数生成不同的代码:
如果mem是一个虚拟函数,并且我们正在通过引用或指针进行调用,则编译器生成的代码将在运行时根据对象的动态类型确定运行哪个版本的虚拟函数;
相反,编译器将生成常规函数调用


class A
{
public:
void p()
{
cout << "a" << endl;
}
};
class B :public A
{
public:
void p()
{
cout << "b" << endl;
}
};
void main()
{
A *a = new A;
A *b = new B;
a->p();
b->p();
delete a;
delete b;
}

输出a,a
————————————————————————————————————

名称查找比类型检查要好
如果派生类的成员与基类的成员具有相同的名称,则派生类会将基类的成员隐藏在其作用域中. 即使派生类成员和基类成员的参数列表不一致,基类成员仍处于隐藏状态.
“隐藏”表示所分配类的功能屏蔽了具有相同名称的基类功能. 规则如下:
(1)如果派生类的函数与基类的函数具有相同的名称c 嵌套类c 嵌套类,但参数不同. 此时,无论是否存在virtual关键字,基类的功能都将被隐藏(不要与重载混淆).
(2)如果派生类的函数具有与基类的函数相同的名称,并且参数相同,但是基类的函数没有virtual关键字. 此时,基类的功能被隐藏(不要与覆盖混淆). 如果存在虚拟,则这时将覆盖它,并且返回类型应该相同,除非返回类型是该类的类型.
我相信仍有一些朋友想学习或理解C / C ++编程. 您可以来我的C / C ++学习裙: 149889655可以免费获得精品C / C ++学习教程
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-198180-1.html
#吴亦凡1106生日快乐##吴亦凡原来你还在这里##吴亦凡夏有乔木##吴亦凡##吴亦凡赴约演爵迹##挑战者吴亦凡##吴亦凡银尘#新歌去不了现场
尤其改革开放初期
换言之你10万存银行一年就是购买力变成99900