C++:虚函数和多态

来源:互联网 发布:姓名抽奖软件 编辑:程序博客网 时间:2024/05/23 19:12



//举例理解虚函数和多态#include <iostream>using namespace std;/*           动物      /    |    \        陆动物 水动物   / | \  狗 马这里的动物、陆动物、水动物都是抽象类,因为他们不存在实例(对象)没有一个具体的"它",可以说"它是动物"(这里是“是”不是“属于”的意思而狗类可以有一个具体"它",可以说,"它是狗"。我们说“狗是动物”,这里的“是”其实是“属于”的意思。因此,可以理解为——抽象类是那种只能说“X属于该类”的类而非抽象类就是可以说“X是该类”的类   *///动物类(抽象类)//含有一个或一个以上纯虚函数的类叫做抽象类class A {public:virtual void show() = 0; //纯虚函数};//陆动物类 这里假定不是抽象类class B1 : public A {public:virtual void show() //虚函数{cout << "B1" << endl;}};//水动物类 这里假定不是抽象类class B2 : public A {public:virtual void show(){cout << "B2" << endl;}};//狗类class C1 : public B1 {public:virtual void show(){cout << "C1" << endl;}};//马类class C2 : public B1 {public:virtual void show(){cout << "C2" << endl;}};void ff(B1 *b1){b1->show();}void _ff(B1& b1){b1.show();}void w_ff(B1 b1){b1.show();}void f(A* a){a->show();}void _f(A& a){a.show();}/*//抽象类不能有对象//下面的函数声明非法void w_f(A a) {;}*/int main(){B1 b1;B2 b2;C1 c1;C2 c2;ff(&b1);  //陆动物是陆动物//ff(&b2); 水动物既不是陆动物也不属于陆动物ff(&c1); //狗属于陆动物(当然不可能有陆动物属于狗,或陆动物是狗)         //更明显的例子是: b1 = c1是合法的, c1 = b1是非法的, b2 = c1更是牛马不相及ff(&c2);cout << endl;//等效于用指针_ff(b1);_ff(c1);_ff(c2);cout << endl;//如果用传值呢?w_ff(b1); //输出B1w_ff(c1); //输出B1w_ff(c2); //输出B1//b1没问题 c1传进入,等效于b1 = c1,那么一只狗变成了一个陆动物类的实例了//调用的show当然是陆动物的show了//(已经假定陆动物类不是抽象类)//c2同理cout << endl;f(&b1);f(&b2);f(&c1);f(&c2);cout << endl;_f(b1);_f(b2);_f(c1);_f(c2);cout << endl;return 0;}