纯粹的虚拟朋友课程

Pure Virtual Friend Class

本文关键字:朋友 虚拟 纯粹      更新时间:2023-10-16

我有一个类A,它有一个指向纯虚拟类B实例的指针。类C派生自B,将自动具有指向A(它是它的父级)的指针,并且需要访问它的成员。这可以通过在类A中添加friend class C来实现,尽管这对于从B派生的每个类都是必需的。

代码示例:

class A
{
public:
    friend class B; // This does not allow derived classes to be friends
    friend class C; // Now derived class B has access to `DoDomething`, but then this is needed for every single derived class
private:
    void DoDomething();
};

class B
{
    virtual void Tick() = 0;
protected:
    A* m_pointerToA; // <- is being set upon creating automatically
};

class C : public class B
{
    virtual void Tick()
    {
        m_pointerToA->DoSomething();
    }
};

有没有一种方法可以让B中的所有派生类都可以访问它们所指向的类A的私有和受保护成员,而不必为每个类添加friend class X

由于友谊不是继承的,因此需要将所有依赖友谊的功能封装到基类B的受保护函数中。这将允许从B派生的所有类访问需要"交友"的A的功能:

class B {
    virtual void Tick() = 0;
protected:
    A* m_pointerToA; // <- is being set upon creating automatically
    void callDoSomething() {
        m_pointerToA->DoSomething();
    }
};

class C : public class B {
    virtual void Tick() {
        std::cout << "Class C is about to tick..." << std::endl;
        callDoSomething();
    }
};
class D : public class B {
    virtual void Tick() {
        callDoSomething();
        std::cout << "Class D has just ticked!" << std::endl;
    }
};

这有效地将类层次结构中使用友谊的区域定位到类B,这有助于封装。