C++新特性05_ 面向对象_虚函数新关键字override、final、default、delete(函数为虚函数且父类有此虚函数才可编译;防止类被继续继承及终止虚函数继续覆盖;保留默认;禁止使用)

本篇还是介绍面向对象,将会介绍虚函数在新语法中有什么样的改变。

1. 显式虚函数覆盖

在传统 C++ 中,经常容易发生意外覆盖虚函数的事情。例如:

class Base {
public:
	virtual void foo() {};
};

class SubClass : Base {
public:
	void foo() {};
};

SubClass::foo 可能并不是程序员尝试覆盖虚函数,只是恰好加入了一个具有相同名字的函数。另一个可能的情形是,当基类的虚函数被删除后,子类拥有旧的函数就不再覆盖该虚拟函数并摇身一变成为了一个普通的类方法,这将造成灾难性的后果。

C++ 11 引入了 override final 这两个关键字来防止上述情形的发生。

2. override:表示函数为虚函数,且父类存在这个虚函数

当覆盖虚函数时,引入 override 关键字将显式的告知编译器进行覆盖,编译器将检查基函数是否存在这样的虚函数,否则将无法通过编译


#include <iostream>

//虚函数中新增关键字override final default delete

//c++中struct和class的区别并不大
class Base {
public:
	virtual void foo() {};
};

class SubClass : Base {
public:
	//子类函数对父类进行了完全的重写,覆盖,运行时转到子类虚函数
	//但是子类父类的函数的关系并不是很明确,因此增加override关键字
	//override关键字表示函数为虚函数,且父类存在这个虚函数
	//override 关键字将显式的告知编译器进行重载,编译器将检查基函数是否存在这样的虚函数,否则将无法通过编译
	void foo() override {};
};

int main()
{
	return 0;
}

运行结果:
在这里插入图片描述

3. final

是为了防止类被继续继承以及终止虚函数继续覆盖引入的。

3. 1 用于类:final 加上后,类不能再被继承


#include <iostream>

//对于类的用法 final 加上后,类不能再被继承
class Base {
public:
	//virtual void foo() {};
};
class SubClass final: public Base {
public:

};

class SubClass2 : public SubClass {
public:

};

int main()
{
	return 0;
}

运行后:
在这里插入图片描述

3. 2 虚函数: 加上final后 函数不能被覆盖


#include <iostream>

//对于类的用法 final 加上后,类不能再被继承
//对于虚函数 final 函数不能被重写

class Base {
public:
	virtual void foo() final{};
};

class SubClass final: public Base {
public:
	//void foo() override {};
	virtual void foo() {};
};

class SubClass2 : public SubClass {
public:

};

int main()
{
	return 0;
}

运行结果:
在这里插入图片描述

4. default

构造函数、拷贝构造,运算符重载等存在默认的形式的,可以使用default保留默认形式。

class Base {
public:
	virtual void foo() final{};

	//存在有参构造,但是又想保留默认构造,可以采用如下写法
	//拷贝构造,运算符重载等有默认的,都可以使用
	Base() = default;

	Base(int n) {
	
	}
};

int main()
{
	Base b();

	return 0;
}

5. delete

类似上面的保存默认,delete为禁止使用默认构造,构造函数、拷贝构造,运算符重载均可以使用。

class Base {
public:
	virtual void foo() final{};

	//类似上面的保存默认,禁止使用默认构造的写法
	Base() = delete;

	//Base(int n) {
	//
	//}
};

int main()
{
	Base b;

	return 0;
}

运行结果:
在这里插入图片描述
6.学习视频地址:虚函数override、final、default、delete
7.学习笔记:虚函数override、final、default、delete笔记

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值