派生类继承基类虚函数&派生类覆盖基类虚函数
(2013-01-16 09:19:45)
标签:
cpp多态 |
分类: Cpp |
1:派生类继承基类的虚函数
virtual void
say_name(){cout<<"i am
base"<<endl;}
virtual void
say_name(){cout<<"base"<<endl;}
void
say_name(){cout<<"base"<<endl;}
void
say_name(){cout<<"i am
derived"<<endl;}
class Base
{
public:
Base(){cout<<"base
constructor"<<endl;}
virtual ~Base(){cout<<"base
desructer"<<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;}
};
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;}
};
class Derived:public Base
{
public:
Derived(){cout<<"derived
consructer"<<endl;}
~Derived(){cout<<"derived
desructer"<<endl;}
};
此时派生类也覆盖了基类的say_name函数。通过基类指针和应用来调用时,查找到say_name不是虚函数,所以在编译的时候就确定了调用基类的say_name.非虚函数肯定是不能实现动态binding的。其实一般不会这样写,要派生类重新实现的就直接声明类virtual。如果派生类不是重新实现基类的函数,就不要与基类的函数同名!
后一篇:linux远程桌面登录