C++多态小结

示例

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();
//上述代码是通过指针调用的虚函数,所以编译器将其编译为通过虚表指针查表得方式得到函数地址,然后再调用。

实际除了通过类对象实例直接调用虚函数之外(再构造/析构函数中调用虚函数也不会形成多态),其他形式调用虚函数都会形成多态。

原文地址:https://www.cnblogs.com/revercc/p/15549981.html