1 多态是什么
多态指的是同样的方法,可以针对不同的参数,调用不同的函数。
之前的时候我们说过函数的覆写。
class Human{
public:
void ecting(void)
{
cout << "Human use hand"<<endl;
}
};
class Englishman : public Human{
public:
void ecting(void)
{
cout << "Englishman use Knife"<<endl;
}
};
class Chinese : public Human{
public:
void ecting(void)
{
cout << "Chinese use chopsticks"<<endl;
}
};
void text_ecting(Human &p)
{
p.ecting();
}
int main(int argc, char **argv)
{
Human h;
Englishman e;
Chinese c;
text_ecting(h);
text_ecting(e);
text_ecting(c);
return 0;
}
这里text_ecting(h);
text_ecting(e);
text_ecting(c);都是会调用基类的方法,因为text_ecting 的参数是Human
2 虚函数
virtual void ecting(void)
{
cout << "Human use hand"<<endl;
}
这里只要将基类的void ecting这个方法修改成virtual。
那这个方法就可以调用各自的void ecting方法了。
3 虚函数的原理
机制:静态联编,动态联编;
对于非虚函数,在编译时,就确定好了调用哪个函数;
对于类内有虚函数的,内部有一个指针,指向虚函数表;这个指针可以帮助我们调用对应的虚函数。
4 多态的规定
1 方法只有调用指针和应用才有多态。
如:text_func(Human *h);text_func(Human &h);可以多态;text_func(Human h);没有多态。
2 只有类的成员函数才可以声明为virtual。
3 静态成员函数不能是虚函数。
4 内联函数不能是虚函数。类内的函数,如果没有加上virtual,那默认是内联函数。
5 构造函数不能是虚函数。
6 析构函数一般都申明为虚函数。(析构,之前写错了。不好意思)
7重载:虚函数参数不同,不可以设置为虚函数;
覆盖:函数参数、返回值相同,可以设为虚函数。
8返回值例外,正常情况下返回值不同,不能设置为虚函数,不过如果返回值为单签对象的指针或应用时,可以设置为虚函数。
*注意
复习Human *h = new Human;可以调用delete 来删除;
且销毁时,先调用自身的析构函数,再调用父类的析构函数时
网友评论