虚函数
1 虚函数定义:在类的定义中,前面有virtual关键字的成员函数就是虚函数。
class base
{
virtual int get();
};
2 int base::get(){}
--virtual关键字只用在类定义里的函数声明中,写函数体时不用。
--构造函数和静态成员函数不能是虚函数
3 虚函数和普通函数差别:虚函数可以参与多态,而普通函数不可以。
多态的表现形式一
1 派生类的指针可以赋给基类指针
2 通过基类指针调用基类和派生类中的同名虚函数时:
(1)若该指针指向一个基类的对象,那么被调用是基类的虚函数
(2)若该指针指向一个派生类的对象,那么被调用的时派生类的虚函数
这种机制就叫做多态
3 例子(见本工程duotai1.cpp)
//
// 多态表现形式一案例
//
#include <iostream>
using namespace std;
class A
{
public:
virtual void someVirtualFunction()
{
cout << "类A的虚函数" << endl;
}
};
class B:public A
{
public:
virtual void someVirtualFunction()
{
cout << "类B的虚函数" << endl;
}
};
int main()
{
B b;
A* a = &b;
a->someVirtualFunction(); // 调用哪个虚函数取决于p指向哪种类型的对象
B b2;
A& a2 = b2;
a2.someVirtualFunction(); // 调用哪个虚函数取决于a2引用哪种类型的对象
return 0;
}
多态的表现形式二
1 派生类的对象可以赋给基类对象
2 通过基类引用调用基类和派生类中的同名虚函数时:
(1)若该引用引用的是一个基类的对象,那么被调用是基类的虚函数
(2)若该引用引用的是一个派生类的对象,那么被调用的是派生类的虚函数
这种机制也叫做“多态”
3 例子(见duotai1.cpp)
多态简单例子(见本工程duotai2.cpp)
//
// 多态简单例子
//
#include <iostream>
using namespace std;
class A
{
public:
virtual void Print()
{
cout << "A::Print()" << endl;
}
};
class B:public A
{
virtual void Print()
{
cout << "B::Print()" << endl;
}
};
class D:public A
{
virtual void Print()
{
cout << "D::Print()" << endl;
}
};
class E:public B
{
virtual void Print()
{
cout << "E::Print()" << endl;
}
};
int main()
{
A a; B b; E e; D d;
A* pa = &a; B* pb = &b;
D* pd = &d; E* pe = &e;
pa->Print();
pa = pb;
pa->Print();
pa = pd;
pa->Print();
pa = pe;
pa->Print();
return 0;
}
多态的用途:
增强程序的可扩充性