class Father
{
public:
virtual ~Father()
{
cout<<"destruct father"<<endl;
}
void nationality()
{
cout<<"nationality is China"<<endl;
}
void born()
{
cout<<"was born in China"<<endl;
}
virtual void appearance(std::string str = "handsome")
{
cout<<"He is "<<str<<endl;
}
};
class Daughter:public Father
{
public:
Daughter(std::string name)
{
cout<<name<<endl;
}
~Daughter()
{
cout<<"destruct daughter"<<endl;
}
void born() //隐藏了父类的born,即使参数不同
{
cout<<"was born in HongKong"<<endl;
}
virtual void appearance(std::string str = "pretty") override //覆盖父类的版本,可以不加virtual,实际上也是虚函数,
{
cout<<"She is "<<str<<endl;
}
};
void main()
{
// f的静态类型是Father*,动态类型是Daughter*
Father *f = new Daughter("Li Liang");
//父类的born不是虚函数,(编译时已绑定)静态绑定,所以派生类最好不要重用基类中的名字,除非是覆盖继承而来的虚函数
f->born();
//父类的appearance为虚函数,动态绑定,多态性,默认参数由静态类型决定
f->appearance();
//不存在从基类向派生类的隐式类型转换,f转换为d是安全的,使用static_cast来强制覆盖编译器的检查
Daughter *d = static_cast<Daughter *>(f);
d->born();
delete f;
}
虚函数
最新推荐文章于 2024-07-13 14:34:09 发布