刚刚编辑好的内容没保存,现在只好重新码。。。
对类继承中牵扯到指针指向类对象的调用以及有虚函数的时候一直既不牢固,于是自己编了一个实例来加深印象。
实例很简单,定义一个基类和子类,基类有两个函数talk和eat,其中eat用virtual关键字声明,在子类中重写了talk和eat函数以示区分,为了能分辨出来到底调用了基类还是子类的函数。
#include<iostream>
#include<string>
using namespace std;
class Base
{
public:
string name;
int age;
Base(string _name,int _age):name(_name),age(_age){}
void talk()
{
cout<<name<<" is talking"<<endl;
}
virtual void eat()
{
cout<<name<<" is eating"<<endl;
}
};
class Son:public Base
{
public:
int height;
Son(string _name,int _age,int _h):Base(_name,_age)
{
height=_h;
}
void talk()
{
cout<<name<<",whose height is "<<height<<",is talking loudly!"<<endl;
}
void eat()
{
cout<<name<<" is eating fast!"<<endl;
}
};
int main()
{
Base person("lily",41);
Base* p=&person;
cout<<"基类类型指针指向基类对象:"<<endl;
p->talk();
p->eat();
cout<<"派生类类型指针指向派生类对象:"<<endl;
Son ason("mike",21,180);
Son* q = &ason;
q->talk();
q->eat();
cout<<"基类类型指针指向派生类对象:"<<endl;
p = &ason;
p->talk();
p->eat();
return 0;
}
输出结果如下:
基类指针指向基类对象和派生类指针指向派生类对象都没有什么问题,都是调用了各自的函数。但是要注意基类指针指向派生类对象时就不一样了!talk函数没有声明为虚函数,所以调用的仍然是基类的,但是eat声明为了虚函数,这时候虚函数的作用就体现出来了!它自动调用了子类当中重写的eat函数。也就是说程序运行时编译器识别出了这个指针指向的是一个派生类对象,所以动态绑定到派生类中的eat函数。c++primer中说了这么一句话,引用和指针的静态类型和动态类型可以不同,这是c++用以支持多态性的基石。