多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。
多态其实可以用一句话概括:成员函数跟着类走,虚函数跟对象走
父类指针调用无法调用子类同名方法
看如下例子:
#include<iostream>
using namespace std;
class A{
public:
void x(){
cout << "A" << endl;
}
};
class B:public A{
public:
void x(){
cout << "B" << endl;
}
};
int main(){
B b;
A &a = b;
A *c = &b;
b.x();
a.x();
c->x();
return 0;
}
//输出结果
//B
//A
//A
这就是非多态下的问题:父类指针调用无法调用子类同名方法。而多态可以解决这样问题。
#include<iostream>
using namespace std;
class A{
public:
virtual void x(){
cout << "A" << endl;
}
};
class B:public A{
public:
void x() override{
cout << "B" << endl;
}
};
int main(){
B b;
A &a = b;
A *c = &b;
b.x();
a.x();
c->x();
return 0;
}
//输出结果
//A
//A
//A
只要有继承,父类的析构函数一定是虚函数
#include<iostream>
using namespace std;
class A{
public:
virtual void x(){
cout << "A" << endl;
}
~A(){
cout << "A over" << endl;
}
};
class B:public A{
public:
void x() override{
cout << "B" << endl;
}
~B(){
cout << "B over" << endl;
}
};
int main(){
A *a = new B();
delete a;
return 0;
}
//输出结果
//A over
原因:析构函数同样是成员方法,所以成员函数跟着类走,虚函数跟对象走,所以只要有继承,父类的析构函数一定是虚函数。
#include<iostream>
using namespace std;
class A{
public:
virtual void x(){
cout << "A" << endl;
}
virtual ~A(){
cout << "A over" << endl;
}
};
class B:public A{
public:
void x() override{
cout << "B" << endl;
}
~B(){
cout << "B over" << endl;
}
};
int main(){
A *a = new B();
delete a;
return 0;
}
//输出
//B over
//A over
纯虚函数
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
C++中的纯虚函数,一般在函数签名后使用=0作为此类函数的标志。
class <类名>
{
virtual <类型><函数名>(<参数表>)=0;
…
};
在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象。
虚函数的对象模型
待补充:https://blog.csdn.net/weixin_40237626/article/details/82313339