【问题标题】:how to customize the nested class's methods in C++如何在 C++ 中自定义嵌套类的方法
【发布时间】:2011-05-19 11:36:47
【问题描述】:

我有一个带有嵌套类 Inner_vector 的 A 类,

class A: 
{
public: 
  class Inner_vector:public Vector
    {
      bool append(const class Element& element);
    };
};
bool A::Inner_vector::append(const class Element& element)
{
   add(element);
}

现在我想从A派生一个子类,还要自定义内部类“Inner_vector”的“append”和“delete”方法(主要是添加一个新的操作),这样自定义的操作就会被调用.我怎么能做到?我是否还应该从 A::Inner_vector 在 Child_A 中派生一个新的嵌套类,如下代码

class Child_A: public A
{
public: 
  class Inner_Child_vector : public A::Inner_vector
    {
      bool append(const class Element& element);
    };
};
bool Child_A::Inner_Child_vector::append(const class Element& element)
{
   A::Inner_vector::append();
   my_new_operation();
}

或者我不需要从A::Inner_vector派生出来直接重写?

我非常感谢任何帮助和 cmets。

【问题讨论】:

  • 我希望你没有从 std::vector 继承?因为那是个坏主意!
  • Inner_vector 是如何使用的?
  • 不,Vector 是一些自定义的基类,它实际上使用了 std::vector。但我无法改变这一点,可能我也无法改变 A 类。
  • Inner_vector 是如何使用的?我认为它将主要通过对象 A 调用,并附加/删除元素。

标签: c++ inheritance inner-classes nested-class


【解决方案1】:

在 C++ 中,除了作用域之外,内部类与包含它们的类无关。所以必须在派生类中派生出基类的内部类。

【讨论】:

  • 您好,Jan,谢谢您的回答。你的意思是它会像我提供的代码示例一样吗?
【解决方案2】:

你总是不能为 inner_vector 创建另一个类,并让它在你的外部类“A”中成为受保护的成员,然后类“A”可以定义两个虚函数追加和删除。

这意味着当您继承和创建“Child_A”时,您只需为追加和删除定义一个新行为。这将要求您扩展您的内部向量类,以便为您提供对其内部的足够访问权限,以便您可以从包含它的类中创建所需的附加和删除行为。

class A 
{
 public: 
  virtual bool append( const class Element& element )
  {
    //  your specific A behaviour
  }     

 protected:
  // std::vector or your own implementation
  std::vector _innerVector;

};

class Derived : public A
{
 public:
  virtual bool append( const class Element& element )
  {
    // derived implementation
  }
};

如果这是不可能的,那么你必须派生这两个类,因为它们是不相关的。

【讨论】:

  • 谢谢 Sergio,不幸的是,A 已经在那里了,我无法用它改变任何东西,例如 append 方法不是虚拟的。
  • 恐怕这行不通,嵌套或不嵌套的类是不相关的,需要单独实现,这似乎是一个很好的情况,应该更改内部向量功能以提供更多处理对其功能的访问,以便您可以使用外部类很好地包装它。
  • 你的意思是,我必须同时导出并维护范围(inner_derived inside derived),就像我提供的代码示例一样?
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 2015-05-17
  • 2012-09-11
  • 2011-10-16
  • 2015-09-27
  • 2012-05-08
相关资源
最近更新 更多