欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++中虚函数的作用

程序员文章站 2024-02-26 21:53:16
...

我最近刚刚开始学习C++,一直对虚函数有些困惑,不知道它有什么用处,于是写了段代码测试了一下,发现它在面向对象编程中主要有两个用处。

1.实现多态

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

class A
{
public:
	virtual void vfunc1()
	{
		cout << "A's vfunc1" << endl;
	}
	void func1()
	{
		cout << "A's func1" << endl;
	}
};

class B:public A
{
public:
	virtual void vfunc1()
	{
		cout << "B's vfunc1" << endl;
	}
	void func1()
	{
		cout << "B's func1" << endl;
	}
};

class C :public B
{
public:
	virtual void vfunc1()
	{
		cout << "C's vfunc1" << endl;
	}
	void func1()
	{
		cout << "C's func1" << endl;
	}
};

int main()
{
	A a; B b; C c;
	vector<A*> foo;
	foo.push_back(&a);
	foo.push_back(&b);
	foo.push_back(&c);
	cout << "虚函数的调用情况" << endl;
	for (auto i:foo)
	{	
		i->vfunc1();
	}
	cout << "非虚函数的调用情况" << endl;
	for (auto i : foo)
	{
		i->func1();
	}
    return 0;
}

因为容器中的每个元素的字节数应该是相同的,所以我指定其存放的格式为指向父类A的指针,占用4个字节,运行代码得到以下结果: 

C++中虚函数的作用

说明调用函数时,虚函数会被子类覆盖,实现动态绑定;而非虚函数仍为A的fun1(),这是静态绑定

 

2.方便客户进行二次开发

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;

class company
{
public:
	virtual void serialize()=0;
	void func()
	{
		cout << "general part I" << endl;
		serialize();
		cout << "general part II" << endl;
	}

};

class client:public company
{
	virtual void serialize()
	{
		cout << "special part" << endl;
	}
};

int main()
{
	client A;
	A.func();
	return 0;
}

可以看到,一些公司提供的代码只编写了通用的部分,而特定的部分需要客户自己实现,因此把特定部分设置为虚函数,留给客户进行二次开发,结果如下:

C++中虚函数的作用

相关标签: C++