基类引用派生类的指针

时间:2016-07-26 13:16:55

标签: c++ c++11 polymorphism

我希望在基类A中,对派生类中的指针引用(或指针,如果不可能)。 这看起来像这样:

 BaseClassController
        {
          public :
            //Constructors, destructor,...

          protected :
            BaseDataClass *& m_current;
        }

DerivedClassAController : public BaseClassController
    {
      public :
        //Constructors, destructor,...

      protected :
        DerivedDataClassA * m_currentA;
    }

DerivedClassBController : public BaseClassController
    {
      public :
        //Constructors, destructor,...

      protected :
        DerivedDataClassB * m_currentB;
    }

,数据类为:

BaseDataClass
{
    void doSomething();
}

DerivedDataClassA : public BaseDataClass
{
 //...
}

DerivedDataClassB : public BaseDataClass
{
 //...
}

接下来我想在BaseClassController中做的是:

BaseClassController::someFunction(){
    m_current->doSomething();
}

问题是m_currentA和m_currentB指向的对象在程序的生命周期中会发生很大的变化,我希望m_current引用在派生类指针发生变化时自动更改。 具体来说,我希望更改m_currentA指向的对象的函数看起来像这样:

DerivedClassAController::changerCurrentA(DerivedDataClassA* ptA){
   m_currentA = ptA;
}

而不是这样:

DerivedClassAController::changerCurrentA(DerivedDataClassA* ptA){
   m_currentA = ptA;
   m_current = ptA;
}

我尝试通过在派生类构造函数中传递指针:

BaseClassController::BaseClassController(BaseDataClass* pt)
 : m_current(pt)
{
}

DerivedClassAController::DerivedClassAController()
 : BaseClassController(m_currentA),
   m_current(A)
{
}

但我最终在DerivedClassAController中有一个指向DerivedDataClassB的m_current。

这是否适合?或者有更好的方法吗?

注意: DerivedClassAController将95%的时间使用m_currentA作为DerivedDataClassA。仅使用基类中的m_current指针将结束将dynamic_cast(m_current)放在任何地方。

1 个答案:

答案 0 :(得分:1)

我认为以下方法可行:不使用成员引用,而是在BaseClassController中创建一个返回指针副本的虚函数:

struct BaseClassController {
    virtual BaseDataClass* m_current() = 0;

在每个派生控制器中以不同方式实现它:

BaseDataClass* DerivedDataClassA::m_current() {
    return m_currentA;