示例
class test1
{
public:
virtual void proc1();
void proc();
};
class test2:public test1
{
public:
virtual void proc1();
};
void test1::proc1()
{
cout<<"1";
}
void test1::proc()
{
proc1();
}
void test2::proc1()
{
cout<<"2";
}
定义了test1和test2两个类,其中test2为test1的子类。其中两个类中都有虚函数Proc1,子类test1还有个成员函数Proc,此成员函数会调用虚函数Proc1。
test2 A;
A.proc();
实例化一个test2类对象,然后调用test1的成员函数proc。由于c++多态的作用实际proc函数调用的是test2的Proc1。因为其是通过虚拟指针查表得到的proc1函数的地址,所以是多态。
误解
误认为只有通过指针和引用调用虚函数时才会形成多态,实际这句话是相对于通过类对象实例直接调用虚函数而言的。
test2 A;
A.Proc1();
//上述代码是通过类实例直接调用虚函数,所以编译器直接编译为直接调用的形式
test2* p;
p->Proc1();
//上述代码是通过指针调用的虚函数,所以编译器将其编译为通过虚表指针查表得方式得到函数地址,然后再调用。
实际除了通过类对象实例直接调用虚函数之外(再构造/析构函数中调用虚函数也不会形成多态),其他形式调用虚函数都会形成多态。