简介:(多态这里没有怎么表述好,之后会更新)
对于多态,它的出现要符合两个条件:你定义的类要有继承,同时基类中有虚函数的存在。只有这两个条件存在,你才能去发现多态的存在。
多态的出现,涉及到关键字virtual.自从继承开始,我们就知道在一个类的前面加上virtual,这就属于虚基类的问题。那么在多态这一问题上,是针对继承类中的函数名前加上virtual.于是最本质的区别就是多态涉及函数。也就是说,我们在继承类中的函数前加上关键字virtual,我们讨论的问题多态就展开了。多态是什么东西?多态的出现解决了什么问题?
首先多态针对的是对于继承中的函数而言,只有针对这些加了virtual的函数,你才有资格谈论多态。同时,多态最重要的一点是继承类中的同名函数。简单说,就是基类中和派生类中相同函数名的函数的调用情况。下面我们将从实列中来探讨:
不涉及virtual虚函数的代码:
#include<iostream> using namespace std; class A{ public: void run(){ cout << "A--run()" << endl; } }; class B :public A{ public: void run(){ cout << "B--run()" << endl; } }; int main(){ //没有使用virtual,所建立对象调用同名函数结果。 A a, *pa; B b, *pb; pa = &a; pa->run();//A类型的指针去指向A类型的对象,然后这个指针去指向这个对象的一个成员函数,那么这个函数调用是这个指针所指向的类中的函数。 pb = &b; pb->run();//B类型的指针去指向B类型的对象,然后这个指针去指向这个对象的一个成员函数,那么这个函数调用是这个指针所指向的类中的函数。 pa = &b; pa->run();// pb = (B*)&a; pb->run(); return 0; }
结果:
涉及virtual虚函数的代码学习:
#include<iostream> using namespace std; class A{ public: virtual void run(){ cout << "A--run()" << endl; } }; class B :public A{ public: void run(){ cout << "B--run()" << endl; } }; int main(){ //使用virtual,所建立对象调用同名函数结果。 A a, *pa; B b, *pb; pa = &a; pa->run(); pb = &b; pb->run(); pa = &b; pa->run(); pb = (B*)&a; pb->run(); return 0; }
结果: