C++抽象基类私有虚函数可见性及相关实现合法性问询
针对你给出的C++代码相关问题解答如下:
class A { public: virtual void f() const = 0; void callf() const { f(); } }; class B : public A { virtual void f() const { } }; int main() { B x; x.callf(); return 0; }
1. 上述代码是否为合法C++代码?
是完全符合C++标准的合法代码,g++、clang编译无告警是正确的结果。
核心原理是:C的成员访问权限检查发生在编译阶段,仅检查调用位置对应的静态类型的成员权限,和运行阶段的动态绑定无关:
- 基类
A的f()被声明为public成员,A的成员函数callf()内部调用f()时,编译器判断静态类型A的f()是公有成员,权限检查直接通过。 - 运行时动态绑定到派生类
B的私有f()属于多态的正常执行逻辑,不会再进行权限校验,因此调用合法。
2. 派生类B是否可以实现基类的纯虚方法,且仅允许B自身及其友元调用这些实现方法?
完全可以,这是C++中非常常用的**非虚拟接口(NVI)**设计模式的典型用法:
- 派生类重写基类虚函数时,允许设置比基类声明更严格的访问权限,不会违反继承规则。
- 这种实现下,外部代码只能通过基类提供的公有非虚接口(如示例中的
callf())间接调用该虚函数的实现;而B类的内部成员、B的友元可以直接调用B::f(),外部直接调用B实例的f()会被编译器以私有成员不可访问为由拦截,完全满足访问限制要求。
内容的提问来源于stack exchange,提问作者francesco
相关产品推荐
相关产品推荐

