C++友元函数与继承场景下如何拆分声明与定义?
问题原因
代码触发了C++的声明顺序依赖死锁:
- 要将
Derived::func2声明为Base的友元,编译器必须先获取Derived类的完整定义以及func2的成员函数声明 - 但
Derived继承自Base,定义Derived的前提是编译器已经看到Base的完整定义,二者形成循环依赖,无法通过调整定义顺序解决
解决方案
最简便的实现方式是将整个Derived类声明为Base的友元,仅需前置声明Derived即可,不需要提前获取Derived的完整定义,同时修正原代码的其他语法错误后可正常编译运行:
#include <iostream> // 仅需前置声明Derived类名 struct Derived; struct Base { virtual void func1() = 0; // 声明整个Derived类为友元 friend struct Derived; private: int some_private = 10; }; struct Derived : Base { virtual void func3() = 0; void func2(Base *child) { std::cout << child->some_private; } // 补全纯虚函数实现,可直接运行测试 void func1() override {} void func3() override {} }; int main() { Derived d; Base* b = &d; d.func2(b); return 0; }
如果确实需要仅对单个成员函数开放权限而不是整个类,可以调整设计为将需要访问的私有字段改为protected修饰,派生类可直接访问无需友元声明。
内容的提问来源于stack exchange,提问作者rvedtsaneon
相关产品推荐
相关产品推荐

