纯虚拟朋友类

Bro*_*ier 4 c++ polymorphism friend pure-virtual

我有一个类A,它有一个指向纯虚拟类的实例的指针B.类C派生自B并将自动具有指向A(其父级)的指针,并且需要访问其成员.这可以通过添加friend class C内部类来实现A,尽管这对于将派生的每个类都是必需的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();
    }
};
Run Code Online (Sandbox Code Playgroud)

有没有办法让所有派生类B都能访问A他们指向的私有和受保护的类成员,而不必friend class X为每个派对添加?

das*_*ght 5

由于友谊不是继承的,因此您需要将依赖于友谊的所有功能包装到基类的受保护功能中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;
    }
};
Run Code Online (Sandbox Code Playgroud)

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