首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >纯虚拟朋友类

纯虚拟朋友类
EN

Stack Overflow用户
提问于 2015-11-23 21:20:33
回答 1查看 890关注 0票数 5

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

代码示例:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-23 21:26:03

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

代码语言:javascript
复制
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,这有助于封装。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33880911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档