加载中…
个人资料
william_uestc
william_uestc
  • 博客等级:
  • 博客积分:0
  • 博客访问:300
  • 关注人气:2
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

派生类继承基类虚函数&派生类覆盖基类虚函数

(2013-01-16 09:19:45)
标签:

cpp多态

分类: Cpp
1:派生类继承基类的虚函数
class Base
{
public:
Base(){cout<<"base constructor"<<endl;}
virtual ~Base(){cout<<"base desructer"<<endl;}
 virtual void say_name(){cout<<"i am base"<<endl;}
};
class Derived:public Base
{
public:
Derived(){cout<<"derived consructer"<<endl;}
~Derived(){cout<<"derived desructer"<<endl;}
};
此时派生类没有覆盖基类的虚函数,那么派生类直接继承基类的虚函数也即是说派生类虚函数表保存的仍然是基类的函数地址。无论通过对象还是引用来调用,都只能调用到基类的say_name函数。

2:派生类覆盖基类虚函数
class Base
{
public:
Base(){cout<<"base constructor"<<endl;}
virtual ~Base(){cout<<"base desructer"<<endl;}
 virtual void say_name(){cout<<"base"<<endl;}
};
class Derived:public Base
{
public:
Derived(){cout<<"derived consructer"<<endl;}
~Derived(){cout<<"derived desructer"<<endl;}
void say_name(){cout<<"i am derived"<<endl;}
};
此时派生类覆盖了基类的虚函数(派生类的该函数也默认是虚函数),此时派生类的虚函数表保存的就是自己的函数地址了。通过引用或指针就可以实现动态binding了。这也是C++中著名的多态!

3:非虚函数
class Base
{
public:
Base(){cout<<"base constructor"<<endl;}
~Base(){cout<<"base desructer"<<endl;}
 void say_name(){cout<<"base"<<endl;}
};
class Derived:public Base
{
public:
Derived(){cout<<"derived consructer"<<endl;}
~Derived(){cout<<"derived desructer"<<endl;}
 void say_name(){cout<<"i am derived"<<endl;}
};
此时派生类也覆盖了基类的say_name函数。通过基类指针和应用来调用时,查找到say_name不是虚函数,所以在编译的时候就确定了调用基类的say_name.非虚函数肯定是不能实现动态binding的。其实一般不会这样写,要派生类重新实现的就直接声明类virtual。如果派生类不是重新实现基类的函数,就不要与基类的函数同名!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有