纯虚拟朋友 Class

Pure Virtual Friend Class

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

派生的每个 class 都是必需的

代码示例:

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 的所有派生 classes 都可以访问它们指向的 class A 的私有和受保护成员,而无需必须为每个添加 friend class X

由于友谊不被继承,你需要将所有依赖于友谊的功能包装到基classB的受保护函数中。这将使所有从 B 派生的 classes 访问需要 "befriending":

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;
    }
};

这有效地将 class 层次结构中使用友谊的区域本地化为 class B,这有助于封装。