C++友元类与继承的工作机制:代码运行疑问及方法锁定咨询
问题解答:友元访问权限与派生类方法不可覆写
一、为什么Printer能通过Derived2指针访问私有成员foo1?
- 友元的访问权限是针对类而非对象实际类型的:Derived1把Printer声明为友元,就意味着Printer有权访问所有Derived1类及其派生类对象中属于Derived1部分的私有成员。哪怕用Derived2指针调用foo1,foo1本质还是Derived1的私有成员,Printer作为Derived1的友元自然能访问。
- 至于foo2:如果它在Base/Derived1中的访问权限是公有的,Printer直接调用完全合理;如果foo2在Derived1中是私有,同样因为Printer是Derived1的友元,能访问Derived2中覆写的该方法——虚函数的覆写不改变友元对基类版本的访问权限,动态调用时友元权限基于静态类型的类关系判断。
二、如何让派生类方法无法被后续子类覆写?
- C++11及以上版本:直接用
final关键字修饰方法。比如在Derived2中声明foo2时写成:
这样后续任何继承Derived2的子类都不能再覆写foo2。如果想让整个类都不能被继承(自然所有方法都无法被覆写),可以把类声明为void foo2() override final;final:class Derived2 final : public Derived1 { ... }; - C++11之前版本:没有直接语法支持,可通过间接方式实现:比如把要保护的方法设为私有,对外提供一个公有非虚的接口函数调用它;或者把类设计成不可继承的(比如用私有构造函数+静态工厂方法)。
内容的提问来源于stack exchange,提问作者Mark Tikhonov
相关产品推荐
相关产品推荐

