一丶多态性
c++的多态性,我认为就是表达相同方法的函数在不同的类中的表现形式不同
举个例子,比如:移动这一行为,人是用两条腿在走路,乌龟是慢慢爬,蛇是爬行,老虎是四条腿在走,鱼是在游动…….
这就是多态性
多态性使不同的对象但是又具有某种共同属性的对象不但可以在一定程度上共享代码,还能共享接口。
二丶虚函数
非静态函数声明的前面加上virtual修饰符,即可以把该函数声明为虚函数
virtual const string name()const{return base_name;}//函数声明时在前面加virtual修饰符
虚函数特性:
1.虚函数可以被派生类重写,从而提供该函数的适用于派生类的专门版本,这就表明了多态性,在不同的类中有不同的表现形式
2.虚函数可以不重写,这样继承下来的虚函数保持其在基类中的定义,即派生类和基类使用同一函数版本
3.虚函数被重写之后仍为虚函数,无论是否使用virtual修饰符
虚函数调用方式:
1.非多态调用
非多态调用是指不借助于指针或者引用的直接调用,非多态调用总是通过成员访问符“.”进行,与普通的成员函数调用类似,不具备多态特征
2.多态调用
借助于指针或者引用直接调用
在C++中,一个基类的指针或者引用可以指向他的派生类对象,而且通过这样的指针或者引用调用虚函数时,调用的是该指针或者引用实际所指向的对象所在类的那个重写版本。
class Base//声明基类
{
string base_name;//定义成员变量
public:
Base()base_name("BASE"){}//基类构造函数,并为变量赋初值
virtual const string my_name()const{return base_name}//虚函数的声明
};
class Derived:public Base//派生类声明
{
string derived_name;
public:
Derived():derived_name("Derived"){}
const string my_name()const{return derived_name}//重写基类虚函数,这就表明了一种多态性
};
void show_ptr(Base &p)
{
cout<<p->my_name()<<"\t"<<p->class_name();
}
int main()
{
Base bb;//基类对象
Derive dd;//派生类对象
show_ptr(&bb);//基类对象的引用
show_ptr(&dd);//派生类对象的引用
return 0;
}
输出结果:
BASE BASE
DERIVED BASE//show_ptr参数为Base类引用,但是却返回派生类重写的虚函数的值?
原因:
调用的是该指针或者引用实际所指向的对象所在类的那个重写版本
因为第二次调用show_ptr的参数是派生类的引用dd,所以指向的是派生类所在的重写了的虚函数,所以返回DERIVED
注:
若把基类中my_name函数的virtual修饰符去掉,不声明为虚函数,则输出结果为:
BASE BASE
BASE BASE
此时调用show_ptr,返回的是基类中的my_name函数的返回值,因为show_ptr
函数的参数是基类的引用。