You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时写成:
    void foo2() override final;
    
    这样后续任何继承Derived2的子类都不能再覆写foo2。如果想让整个类都不能被继承(自然所有方法都无法被覆写),可以把类声明为final:
    class Derived2 final : public Derived1 { ... };
    
  • C++11之前版本:没有直接语法支持,可通过间接方式实现:比如把要保护的方法设为私有,对外提供一个公有非虚的接口函数调用它;或者把类设计成不可继承的(比如用私有构造函数+静态工厂方法)。

内容的提问来源于stack exchange,提问作者Mark Tikhonov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:32:48