c++中的虚函数

时间:2022-09-09 19:31:18
#include <iostream>
#include
<string>
using namespace std;

class Base
{
public:
virtual void print_val()
{
cout
<< "base" << endl;
}
};
class Derived : public Base
{
public:
void print_val()
{
cout
<< "Derived" << endl;
}
};

int main()
{
Derived d;
Base ob(d);
Base
*pb = &d;
Base
&yb = d;
ob.print_val();
pb
->print_val();
yb.print_val();
}

运行结果
c++中的虚函数

现象

程序用了三种方式来测试虚函数的调用:基类对象、基类指针、基类引用。由结果可以看出,当用引用、指针调用虚函数是调用的是派生类的实际函数,而不是基类的虚函数。

结论

  • 当通过基类的对象直接调用虚函数时,总是调用该对象所属的函数。所以ob是基类的对象,调用的是基类的实例
  • 当使用指向基类的指针或引用调用时,将动态绑定虚函数,即调用该指针或引用所指的类型定义的函数。pb是指向基类对象的指针,但是实际指向的是派生类对象,所以调用派生类的实例

对比

#include <iostream>
#include
<string>
using namespace std;

class Base
{
public:
void print_val()
{
cout
<< "base" << endl;
}
};
class Derived : public Base
{
public:
void print_val()
{
cout
<< "Derived" << endl;
}
};

int main()
{
Derived d;
Base ob(d);
Base
*pb = &d;
Base
&yb = d;
ob.print_val();
pb
->print_val();
yb.print_val();
}

结果
c++中的虚函数

总结

定义:在某基类中声明为 virtual 并在一个或多个派生类中被 重新定 义的成员函数
语法:virtual 函数返回类型 函数名(参数表) {函数体;}
用途 实现多态性,通过指向 派生类基类指针,访问派生类中同名覆盖成员函数