c++的virtual和override作用

本文探讨了C++中的virtual关键字和override关键字在多态中的作用。虚拟函数(virtual)允许基类指针调用子类的重写函数,而override则确保子类函数明确重写基类的虚函数,否则编译失败。总结了virtual无virtual时的覆盖行为,以及带virtual和override的重写规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

c++的virtual提供了运行时的多态,可以用基类的指针调用子类对象的函数,通过override可以强制要求基类有对应的虚函数。

二、测试代码
#pragma once
#include <stdio.h>
class Base
{
public:
	void A_1() 
	{
		printf("Base::A_1\n");
	};
	virtual void A_2() 
	{
		printf("Base::A_2\n");
	}
	virtual void A_3() 
	{
		printf("Base::A_3\n");
	}

	virtual void A_4()
	{
		printf("Base::A_4\n");
	}

	void A_5() 
	{
		printf("Base::A_5\n");
	}
};

class Drived : public Base
{
public:
	void A_1() //覆盖了基类的函数,用基类指针调用时调用到的时基类的A_1,用子类指针调用时调用到的时子类的A_1
	{
		printf("Drived::A_1\n");
	};
	virtual void A_2() //用基类或子类指针都调用到的是子类的A_2,之类的virtual说明的是是子类的A_2还可以被virtual
	{
		printf("Drived::A_2\n");
	}
	void A_3() //用基类或子类指针都调用到的是子类的A_2
	{
		printf("Drived::A_3\n");
	}

	virtual void A_4() override //子类加上override,如果基类没有对应virtual函数就会编译错误。避免拼错和记错没有重写基类函数
	{
		printf("Drived::A_4\n");
	}
	/*
	void A_5() override //编译错误 'Drived::A_5': method with override specifier 'override' did not override any base class methods	
	{ 
		printf("Drived::A_5\n");
	}
	*/
};

class Drived2 : public Drived
{
public:
	void A_2() override 
	{
		printf("Drived2::A_2\n");
	}
	void A_3()  override//用基类或子类指针都调用到的是子类的A_2
	{
		printf("Drived2::A_3\n");
	}
};

class VirtualTest
{
public:
	void DoTest()
	{
		Drived *drived = new Drived();
		Base *base = drived;
		base->A_1();
		drived->A_1();
		printf("\n");

		base->A_2();
		drived->A_2();
		printf("\n");

		base->A_3();
		drived->A_3();
		printf("\n");

		base->A_4();
		drived->A_4();
		printf("\n");

		Drived2 *drived2 = new Drived2();
		base = drived2;
		drived = drived2;
		
		base->A_2();
		drived->A_2();
		drived2->A_2();
		printf("\n");

		base->A_3();
		drived->A_3();
		drived2->A_3();

	}
};
三、输出
Base::A_1
Drived::A_1

Drived::A_2
Drived::A_2

Drived::A_3
Drived::A_3

Drived::A_4
Drived::A_4

Drived2::A_2
Drived2::A_2
Drived2::A_2

Drived2::A_3
Drived2::A_3
Drived2::A_3
四、总结

1、基类函数没加virtual,子类有相同函数,实现的是覆盖。用基类指针调用时,调用到的是基类的函数;用子类指针调用时,调用到的是子类的函数。
2、基类函数加了virtual时,实现的时重写。用基类指针或子类指针调用时,调用到的都是子类的函数。
3、函数加上override,强制要求基本相同函数需要是虚函数,否则会编译报错。
4、子类的virtual可加可不加,建议加override不加virtual。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值