且看代码。
#include<iostream>
using namespace std;
class A
{
public:
void SHOW()
{
cout<<"1"<<endl;
}
void PRINT()
{
cout<<"2"<<endl;
}
};
class B:public A
{
public:
void SHOW()
{
cout<<"3"<<endl;
}
void PRINT()
{
cout<<"4"<<endl;
}
};
int main()
{
A* P=new A();
P->SHOW();
P->PRINT();
delete P;
cout<<endl;
B* PP=new B();
PP->SHOW();
PP->PRINT();
delete PP;
cout<<endl;
//但很多时候会出现这样的东东。
A* PPP=new B();//基类指针指向子类对象
PPP->SHOW();
PPP->PRINT();
delete PPP;
return 0;
}
我们发现第三种情况的输出和第一种情况是一样的,那么第三种写法有什么作用呢?且看代码。
#include<iostream>
using namespace std;
class A
{
public:
void SHOW()
{
cout<<"1"<<endl;
}
virtual void PRINT()
{
cout<<"2"<<endl;
}
};
class B:public A
{
public:
void SHOW()
{
cout<<"3"<<endl;
}
void PRINT()
{
cout<<"4"<<endl;
}
};
int main()
{
A* P=new A();
P->SHOW();
P->PRINT();
delete P;
cout<<endl;
B* PP=new B();
PP->SHOW();
PP->PRINT();
delete PP;
cout<<endl;
//但很多时候会出现这样的东东。
A* PPP=new B();//基类指针指向子类对象
PPP->SHOW();
PPP->PRINT();
delete PPP;
return 0;
}
只是将基类 PRINT函数设为虚函数,那么结果呢?
这样结果就变了。为什么呢?这就是多态的一个简单应用。
多态具体指什么呢?
一句话来说,多态是指允许子类类型的指针赋值给父类类型的指针。c++多态性是通过虚函数来实现的,而子类重新定义父类虚函数的做法,叫做覆盖或重写。覆盖指子类重新定义了基类的虚函数,函数名相同,参数相同;重载指子类重新定义了基类的函数,函数名相同,参数不相同(参数类型、参数个数)。上面的例子就是覆盖。
有人如是说:多态的覆盖主要是靠关键字virtual来实现的,这个关键字代表了一种叫“延迟绑定”的技术,当你用一个基类的指针或者引用来指向一个对象的时候,编译器在编译阶段是不知道绑定的对象是基类对象还是派生类对象的,直到运行期间才得知的。