行业资讯
条款12:为意在重写的函数添加override声明
目录条款12为意在重写的函数添加override声明Declare overriding functions override重写条件重写案例语境关键字override引用限定符、条款12为意在重写的函数添加override声明Declare overriding functions override重写条件虽然“重写overriding”听起来像“重载overloading”然而两者完全不相关。重写的一个常见用途在面向对象继承体系中派生类重写基类的虚函数实现通过基类接口调用派生类的成员函数运行时多态。要想重写一个函数必须满足下列要求基类中的函数必须是虚函数基类和派生类中的函数名字必须完全相同析构函数除外)基类和派生类中的函数形参类型必须完全相同基类和派生类中的函数常量性constness必须完全相同基类和派生类中的函数返回值和异常规格必须兼容基类和派生类中的函数引用限定符reference qualifiers必须完全相同C11新增注1成员函数的引用限定符是C11中鲜为人知的语言特性它可以限定成员函数只能用于左值或右值。注2带有引用限定符的成员函数不必是虚函数如下图所示。注3更多细节见“引用限定符”。重写案例由上可知函数重写需要满足一系列严格的条件。这意味着即便是小小的错误也可能导致大大的差异。在实际编程中包含重写的错误代码通常都是合法的但是表达的意图并不符合程序员的初衷。因此在这种情况下程序员不能过度依赖编译器来发现问题而应更加谨慎地检查代码以确保函数确实按照预期完成了重写。如下图所示代码完全合法也合情合理但是不存在任何的虚函数重写。换言之没有任何一个派生类函数和基类函数是绑定的。具体分析如下mf1()Base中的mf1的常量性是const而Derived中的则是non-const。mf2()Base中的mf2的形参类型是int而Derived中的则是unsigned int。mf3()Base中的mf3的引用限定符是而Derived中的则是。mf4()Base中的mf4未声明为虚函数。语境关键字override语法把override关键字放到函数声明的后面作用显式重写虚函数提高程序的正确性确保在派生类的重写函数与基类的虚函数有相同的签名即满足所有“重写条件”。假设在重写过程中因为误操作违背了任何一个“重写条件”编译器都会提示语法错误。提高程序的可读性明确表明派生类将会重写基类的虚函数当你打算更改基类虚函数的签名时override可以帮你衡量波及的影响面。如果派生类全都用上override声明则可以直接改掉基类函数签名并重新编译就能看到造成了多大破坏即多少派生类不能通过编译从而决定是否值得更改函数签名。如果没有override声明你只能寄希望于完善的单元测试。因为那些意在改写却未改写基类函数的派生类虚函数不一定能触发编译器警告。代码修正1以下代码不可以通过编译代码修正2以下代码可以通过编译语境关键字contextual keywordsoverride、final解析规则在特定语境中编译器将其视为关键字。不在特定语境中编译器将其视为普通标识符例如变量名或函数名。概念辨析传统关键字在任何地方都具有关键字含义不能作为变量名语境关键字只有在特定环境下才是关键字可以作为变量名设计原理在C标准不断扩展时如果每新增一个特性就新增一个真正关键字可能会导致大量旧代码无法编译。因此引入“语境关键字”可以避免新增关键字对旧代码已有代码的破坏。案例分析对于语境关键字override而言只有当它出现在成员函数声明的末尾时才有保留意义。换言之override只在这一特定语境下才被视为关键字在其他位置仍然可以作为普通标识符使用。因此如果某些遗留代码已经将override用作变量名、函数名或其他标识符也不必为了升级到C11而改名。引用限定符、概念辨析引用限定符针对发起成员函数的对象即*this加以区分左值对象右值对象。常量限定符表明发起成员函数的对象即*this是const常量对象。场景描述考虑如下的Widget类成员变量std::vectordouble类型成员函数访问器函数data() → 让客户能对这个数据成员直接访问实现1不推荐不区分对象即不同对象调用同一个成员函数程序分析成员函数data的返回值是左值引用std::vectordouble而左值引用被定义为左值。这意味着任何Widget对象无论是左值还是右值调用成员函数data都将会返回左值。进一步地使用函数返回的左值初始化另一个变量都将会实施拷贝构造函数。左值对象拷贝其中的数据成员是合理的。vals1是通过具名对象w的数据成员values实施拷贝构造得到的。右值对象拷贝其中的数据成员纯属浪费时间最佳的做法是移动而非拷贝。vals2是通过临时对象由工厂函数makeWidget创建并返回的成员函数values实施拷贝构造得到的。实现2推荐区分对象即不同对象调用不同的成员函数程序设计使用引用限定符为data的Widget的左值和右值类型进行重载。左值引用类型的重载版本返回的是左值引用左值右值引用类型的重载版本返回的是临时对象右值。程序分析客户代码的行为符合预期
郑州网站建设
网页设计
企业官网