C ++ Diamond继承 - 与另一个非基类共享变量

时间:2013-07-15 14:35:06

标签: c++ class inheritance virtual ambiguous

这是我关于stackoverflow的第一篇文章,所以请保持温和:)

我有标准的钻石问题,但我设法将其整理出来。

class Control  
{ 
  public:  
    bool Focused;  
};

class Caption : public virtual Control  
{
  public:  
    string Text;  
};

class Frame : public virtual Control { };

class Textbox : public Caption, public Frame, public TextEditor { };

遗憾的是,继承存在另一个问题。类TextEditor具有公共变量名称:

class TextEditor
{
  public:
    bool Focused;  
    string Text;  
};

编译器给我错误:

  

模糊访问'文字'

     

模糊地访问'聚焦'

但我想要的是所有类中的变量将在派生类' Textbox'中合并。

  

Here's link to the UML picture with the problem

感谢您提供任何帮助 对不起任何语言错误和/或我问的问题。

更新

一点解释因为我可能会使用错误的单词。对不起。

通过'合并'我的意思是:

  • 如果我使用ControlCaptionFrame的变量或方法,则会影响TextEditor的值,反之亦然。换句话说,变量在派生类中共享。

所以我的最后一堂课将会是这样的:

class Textbox : public Caption, public Frame, public TextEditor  
{  
  public:   
    string Text;  
    bool Focused;  
};

而不是这样:

class Textbox : public Caption, public Frame, public TextEditor  
{  
  public:   
    string Caption::Text;   
    bool Caption::Focused;  
    string TextEditor::Text;  
    bool TextEditor::Focused;  
};

现在发生了什么。因为我不能这样做:

Textbox A;
A.Text = "Text";

因为我有两个名为Text的变量。所以我必须这样做:

Textbox A;
A.Caption::Text = "Text";
A.TextEditor::Text = "Text";

祝你好运 Lavi的

1 个答案:

答案 0 :(得分:0)

注意:

  1. 考虑使用mutator methods
  2. http://sscce.org/ - 您的示例似乎有点超出了展示 - 如果问题中的示例实际上是sscce,那么会更容易为您提供如何解决问题的明确示例。无论哪种方式,它仍然足够,我猜你的问题很清楚。
  3. 数目:

    1. 为什么class TextEditor也不会继承class Controlclass Caption?这似乎是一个显而易见的解决方案 - 你仍然必须使用class TextBox的虚拟继承。
    2. 如果1不是一个选项 - 那就是这个 - 但是在这个有限的样本中,HasText和Focusable分别与Caption和Control相比似乎毫无意义。

      class HasText
      {   
      public:
          virtual string& text() { return text; }
          virtual const string& text() const { return text; }
      private:
          text
      };  
      
      class Focusable
      {   
      public:
          virtual bool& focused() { return focused; }
          virtual const bool& focussed() const { return focussed; }
      };  
      
      class Control : public virtual Focusable { };
      
      class Caption : public virtual Control, public virtual HasText { };
      
      class Frame : public virtual Control { };
      
      class TextEditor : public virtual HasText, public virtual Focusable { };
      
      class Textbox : public virtual Caption, public virtual Frame, public virtual TextEditor { };