当子类成员变量与父类成员变量同名时
子类依然从父类继承同名成员
在子类中通过作用域分别符::进行同名成员区分
同名成员存储在内存中的不同位置
函数重写和函数重载的区别
函数重写: 在子类中定义与父类中原型相同的函数发生函数重写,函数重写只发生在父类与子类之间
函数重载:是一个类里面有相同的函数名参数不同才叫函数重载
函数重写
父类中被重写的函数依然会继承给子类
默认情况下子类中重写的函数将隐藏父类中的函数
通过作用域分辨符::可以访问到父类中被隐藏的函数
#include <iostream>
#include <string>
using namespace std;
class parent
{
public:
void print()
{
cout<<"parent!"<<endl;
}
};
class children: public parent
{
protected:
public:
void print() //和父类函数同名,函数重写
{
cout<<"children!"<<endl;
}
};
int main()
{
parent p;
children c;
p.print();
c.print(); //打印结果为 children!
c.parent::print(); //打印结果为:parent! 作用域分辨符::
getchar();
return 0;
}
当父类对象引用子类对象,指针指向子类对象,或者子类对象直接给父类对象赋值时候发生函数重写结果会是啥样的呢?
int main()
{
children c;
parent p1=c;
parent *p2=&c;
parent &p3=c;
p1.print(); //打印结果为:??
p2->print(); //打印结果为:??
p3.print(); //打印结果为:??
getchar();
return 0;
}
结果为:
在编译时,编译器自动根据指针的类型判断指向的是一个什么样的对象所以编译器认为父类指针指向的是父类对象,由于程序没有运行,所以不可能知道父类指针指向的具体是父类对象还是子类对象,从程序安全的角度,编译器假设父类指针只指向父类对象,因此编译的结果为调用父类的成员函数