将方法添加到派生类并从基指针调用它

时间:2015-02-03 06:12:54

标签: c++ inheritance polymorphism downcast

假设我有以下类层次结构:

class A
{
public:
    virtual ~A();
};

class B : public A
{};

class AUser
{
public:
    virtual ~AUser();
protected:
    A* m_pA;
};

class BUser : public AUser
{};

现在我想向B添加一个方法,该方法与A无关,只会从BUser调用。

class B : public A
{
public:
    void addedFunctionality()
    {
        // do something
    }
};

要调用添加的方法,我有两个选择:

  1. 将空方法添加到A:

    class A
    {
    public:
        virtual ~A();
        void addedFunctionality()
        {
            // do nothing
        }
    };
    
    class BUser : public AUser
    {
        void useB()
        {
            m_pA->addedFunctionality();
        }
    };
    
  2. 使用向下转换调用添加的方法:

    class BUser : public AUser
    {
        void useB()
        {
            static_cast<B*>(m_pA)->addedFunctionality();
        }
    };
    
  3. 我知道应该避免向下倾斜,但我不喜欢第一个选项,因为它毫无理由地膨胀了A的代码。

    还有其他设计选择吗?

1 个答案:

答案 0 :(得分:0)

最简单的解决方案如下所示(也由Ulrich Eckhardt建议):

class AUser
{
public:
    AUser(A* a)
    {
      m_pA = a;
    }
protected:
    A* m_pA;
};

class BUser : public AUser
{
public:
    BUser(B* b) : AUser(b)
    {
      m_pB = b;
    }

    void useB()
    {
        m_pB->addedFunctionality();
    }
protected:
    B* m_pB;
};

不太干净,但你也可以考虑这个:

class BUser : public AUser
{
public:
    BUser(B* b) : AUser(b)
    {
    }
    void useB()
    {
        getB()->addedFunctionality();
    }
protected:
    B *getB()
    {
      return dynamic_cast<B*>(m_pA);
    }

};