赞
踩
本篇还是介绍面向对象,将会介绍虚函数在新语法中有什么样的改变。
在传统 C++ 中,经常容易发生意外覆盖虚函数的事情。例如:
class Base {
public:
virtual void foo() {};
};
class SubClass : Base {
public:
void foo() {};
};
SubClass::foo 可能并不是程序员尝试覆盖虚函数,只是恰好加入了一个具有相同名字的函数。另一个可能的情形是,当基类的虚函数被删除后,子类拥有旧的函数就不再覆盖该虚拟函数并摇身一变成为了一个普通的类方法,这将造成灾难性的后果。
C++ 11 引入了 override
和 final
这两个关键字来防止上述情形的发生。
当覆盖虚函数时,引入 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; }
运行结果:
是为了防止类被继续继承以及终止虚函数继续覆盖引入的。
#include <iostream> //对于类的用法 final 加上后,类不能再被继承 class Base { public: //virtual void foo() {}; }; class SubClass final: public Base { public: }; class SubClass2 : public SubClass { public: }; int main() { return 0; }
运行后:
#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; }
运行结果:
构造函数、拷贝构造,运算符重载等存在默认的形式的,可以使用default保留默认形式。
class Base { public: virtual void foo() final{}; //存在有参构造,但是又想保留默认构造,可以采用如下写法 //拷贝构造,运算符重载等有默认的,都可以使用 Base() = default; Base(int n) { } }; int main() { Base b(); return 0; }
类似上面的保存默认,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笔记
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。