C++ 类中会用到的关键字之-override(virtual、override、friend、default、delete、final)

C++ 类中会用到的关键字之-override(virtual、override、friend、default、delete、final)

接上篇文章,此篇内容主要梳理override相关内容,如有不合理地方请大家及时联系,多谢!

2.override(重写)

c++11中引入override,引入目的如下:

  1. 提示读者此函数重写了基类虚函数(表示这个函数是从基类继承);
  2. 强制编译器检查此函数定义是否重写基类虚函数;

在c++中说到override,有几个易混淆的术语需要分清楚,下面具体说明下:

术语说明
重载同一个类中,函数名相同,参数列表不同,编译器会根据同名的函数不同的参数列表,生成不同名称的预处理函数,未体现多态
重写(override)子类重新定义父类中有相同名称、相同参数的虚函数,体现了多态
重定义(隐藏)子类重新定义父类中有相同名称的非虚函数,参数列表可以相同,可以不同,会覆盖父类的方法,未体现多态

重载例子:

#include<iostream>
#include<string>
//#include <utility>

class InheritClass
{
public:
   	InheritClass(){ std::cout << "  Here is InheritClass Constructor!" << std::endl; iNum = 0;}
    ~InheritClass(){std::cout << "  Here is InheritClass Destructor!" << std::endl;}
	
	
	void getBaseInfo()
	{
		std::cout << "  Here is InheritClass void getBaseInfo!";
		std::cout << "  iNum:" << iNum << std::endl;
	}

template<typename T>
	void getBaseInfo(T&& t )
	{
		std::cout << "  Here is InheritClass template void getBaseInfo!";
		std::cout << "  input:" << t << std::endl;
	}
	
private:
	int iNum;
	
};

int main()
{
	InheritClass struInheritClass;
	struInheritClass.getBaseInfo();
	struInheritClass.getBaseInfo("Hello world!");
	struInheritClass.getBaseInfo(5);
	return 0;

}
  Here is InheritClass Constructor!
  Here is InheritClass void getBaseInfo!  iNum:0
  Here is InheritClass template void getBaseInfo!  input:Hello world!
  Here is InheritClass template void getBaseInfo!  input:5
  Here is InheritClass Destructor!
在这里插入代码片

重写(override)例子:

#include<iostream>
#include<string>

class Base
{
public:
	Base()
	{
		std::cout << "  Here is Base Constructor!" << std::endl;
		iNum = 0;
	}
    virtual ~Base(){std::cout << "  Here is Base Destructor!" << std::endl;}

    virtual void getBaseInfo() 
	{
		std::cout << "  Here is Base void getBaseInfo!";
		std::cout << "  iNum" << iNum << std::endl;
	}
    int iNum ;
};

class InheritClass:public Base
{
public:
   	InheritClass(){std::cout << "  Here is InheritClass Constructor!"<< std::endl;}
    ~InheritClass(){std::cout << "  Here is InheritClass Destructor!" << std::endl;}

	//override 关键字主要用来防止写错接口中某个条件之后导致的编译器认为重载此接口,正常编译的情况
	void getBaseInfo() override 
	{
		std::cout << "  Here is InheritClass void getBaseInfo!";
		std::cout << "  iNum:" << iNum << std::endl;
	}

template<typename T>
	void getBaseInfo(T&& t )
	{
		std::cout << "  Here is InheritClass template void getBaseInfo!";
		std::cout << "  input:" << t << std::endl;
	}
};

int main()
{	
	Base* pBaseNew = new InheritClass;
	pBaseNew->getBaseInfo();                        //多态
	delete pBaseNew;
	pBaseNew = NULL;
	
	InheritClass struInerit;
	struInerit.getBaseInfo();                       //重载
	struInerit.getBaseInfo("Hello world!");
}
  Here is Base Constructor!
  Here is InheritClass Constructor!
  Here is InheritClass void getBaseInfo!  iNum:0
  Here is InheritClass Destructor!
  Here is Base Destructor!
  Here is Base Constructor!
  Here is InheritClass Constructor!
  Here is InheritClass void getBaseInfo!  iNum:0
  Here is InheritClass template void getBaseInfo!  input:Hello world!
  Here is InheritClass Destructor!
  Here is Base Destructor!

重定义(隐藏)例子:

#include<iostream>
#include<string>

class Base
{
public:
	Base()
	{
		std::cout << "  Here is Base Constructor!" << std::endl;
		iNum = 0;
	}
    virtual ~Base(){std::cout << "  Here is Base Destructor!" << std::endl;}//如有内存分配,需加virtual关键字释放子类中内存分配,详细后面介绍
	
	void getClassName(std::string& str) {
		std::cout << "  Here is Base void getClassName!";
		str = "Base class";
		std::cout << "  class name:" << str <<std::endl;
	}
    int iNum ;
};

class InheritClass:public Base
{
public:
   	InheritClass(){std::cout << "  Here is InheritClass Constructor!"<< std::endl;}
    ~InheritClass(){std::cout << "  Here is InheritClass Destructor!" << std::endl;}
	
	void getClassName(std::string& str) {
		std::cout << "  Here is InheritClass void getClassName!";
		str = "InheritClass class";
		std::cout << "  class name:" << str <<std::endl;
	}
};

int main()
{
	std::string str = "";
	
	Base struBase;
	struBase.getClassName(str);
	
	InheritClass struInerit;
	struInerit.getClassName(str);
	
/*
	Base* pBaseNew = new InheritClass;                     
	//pBaseNew->getClassName();                  //父类接口无virtual,无法实现多态
	delete pBaseNew;
	pBaseNew = NULL;
*/	
}
  Here is Base Constructor!
  Here is Base void getClassName!  class name:Base class
  Here is Base Constructor!
  Here is InheritClass Constructor!
  Here is InheritClass void getClassName!  class name:InheritClass class
  Here is InheritClass Destructor!
  Here is Base Destructor!
  Here is Base Destructor!

此篇文章主要介绍c++ 类中用到的override关键字,如有错误请各位看官及时联系,便于及时更正!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值