//举例理解虚函数和多态
#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); //输出B1
w_ff(c1); //输出B1
w_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;
}