【问题标题】:multiple protected inheritance with polymorphism具有多态性的多重保护继承
【发布时间】:2015-03-02 06:24:55
【问题描述】:

我有一个关于受保护函数和多态性的多重继承的问题。 很难描述,所以我希望它足够清楚。

假设我有三个班级:

class baseClass
{
 protected:
    virtual int function() = 0;
}; 


class derived_A:public baseClass
{
  int function()
    {
      //implementation 1
    };
};


class derived_B:public baseClass
{
   int function()
     {
       //implementation 2
     };
 };


class derived_C:public derived_A, public derived_B
{
  baseClass ** p_arr; //array of pointers of baseClass kind (polymorphism)
  int x=0;

  for (int i=0; i<arraySize; i++) // array size = many classes like derived_A, derived_B...
  {
     x = p_arr[i]->function(); //I already have function that builds this array
                               //it is not the question so I didn't put it here.
     // process x
   }

};

最后我的问题是 - 我如何从 derived_C 类(在 for 循环内)访问“受保护的”function()? 我有点困惑......并且很乐意解释。

谢谢。

【问题讨论】:

    标签: c++ inheritance polymorphism protected


    【解决方案1】:

    当 C++ 允许访问 protected 成员时,它只允许访问 this 对象的成员(如提到的 herehere)。代码x = p_arr[i]-&gt;function() 试图调用另一个对象中的方法,因此编译器报错。

    要修复您的代码,您可以将function 公开,或将friend 声明添加到baseClass,如下所示:

    class baseClass
    {
     public:
        virtual int function() = 0;
    }; 
    

    或者

    class baseClass
    {
     protected:
        friend class derived_C;
        virtual int function() = 0;
    }; 
    

    但是,要保留protected 访问权限并且在基类中不提及派生类的名称,您可以通过向基类添加static 访问器函数来修复您的代码:

    class baseClass
    {
     protected:
        virtual int function() = 0;
        static int call_the_function_on_object(baseClass& obj) {return obj.function();}
    }; 
    

    以这种方式使用它(在派生类中):

    x = call_the_function_on_object(*p_arr[i]);
    

    你也可以给访问函数同名,但是,如果你的derived_C覆盖了虚方法,它将隐藏访问函数。您可以通过显式引用基类来解决此问题:

    class baseClass
    {
     protected:
        virtual int function() = 0;
        static int function(baseClass& obj) {return obj.function();}
    }; 
    
    ...
    class derived_C:public derived_A, public derived_B
    {
        ...
            x = baseClass::function(*p_arr[i]);
        ...
    }
    

    【讨论】:

    • 感谢您的详细解答!我尝试从您将函数声明为朋友的第一个解决方案开始:在 BaseClass:friend int derived_c::function();但我收到此错误:'derived_C': is not a class or namespace name 为什么我会收到此消息?
    • 另外,如果我添加#include BaseClass,它将是循环包含和“糟糕的设计”,就像我在其他帖子中看到的那样......或者我错了?
    • 据我所知,在未声明的类中声明友元方法是不可能的。所以只需让整个derived_C 班级成为朋友。我已经添加了语法来做到这一点。
    • 我让derived_C 成为BaseClass 的朋友。谢谢!
    【解决方案2】:

    在这种情况下,您的function() 在派生类中是私有的。所以,从derived_C 你不能直接访问那个函数。

    不过,如果你愿意的话public/protected。然后你可以使用:-

    derived_C dc;
    dc.derived_A::function();
    dc.derived_B::function();
    

    【讨论】:

    • protected 就足够了。
    • 在这个答案的上下文中,它会。但 OP 的代码不同,所以只有 public 会有所帮助。
    • @anatolyg 你为什么这么认为?
    • @AlanStokes 这在my answer 中有解释;还转载了here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2011-07-24
    • 2015-10-26
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多