как настроить методы вложенного класса в C

#c #inheritance #inner-classes #nested-class

#c #наследование #внутренние классы #вложенный класс

Вопрос:

У меня есть класс A с вложенным классом Inner_vector,

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

Теперь я хочу вывести дочерний класс из A, а также настроить методы «append» и «delete» внутреннего класса «Inner_vector» (в основном, для добавления одной новой операции), чтобы вместо этого вызывались настроенные операции. Как я мог это сделать? должен ли я также наследовать новый вложенный класс внутри Child_A из A::Inner_vector в виде следующего кода

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

Или мне не нужно наследовать из ::Inner_vector и напрямую переписывать его?

Я действительно ценю любую помощь и комментарии.

Комментарии:

1. Я надеюсь, вы не наследуете от std::vector? Потому что это ПЛОХАЯ идея!

2. Как Inner_vector используется?

3. нет, Vector — это некоторый настраиваемый базовый класс, который на самом деле использует std::vector. Но я не могу изменить это, и, вероятно, я также не смог бы изменить класс A.

4. Как используется Inner_vector? Я думаю, что в основном он будет вызываться через объект A и элемент добавления / удаления.

Ответ №1:

В C внутренние классы не связаны с содержащими их классами, за исключением области видимости. Итак, вы должны наследовать базовый внутренний класс в производном классе.

Комментарии:

1. Привет, Ян, спасибо за твой ответ. Вы имеете в виду, что это было бы похоже на приведенный мной пример кода?

Ответ №2:

Вы всегда можете не создавать другой класс для inner_vector и сделать его защищенным членом вашего внешнего класса ‘A’, тогда класс ‘A’ сможет определить две виртуальные функции append и delete.

Это означает, что когда вы наследуете и создаете ‘Child_A’, вы просто определяете новое поведение для добавления и удаления. Это потребует от вас расширения вашего внутреннего векторного класса, чтобы предоставить вам достаточный доступ к его внутренним элементам, чтобы вы могли создавать желаемые варианты добавления и удаления из классов, которые его содержат.

 class A 
{
 public: 
  virtual bool append( const class Elementamp; 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 Elementamp; element )
  {
    // derived implementation
  }
};
  

Если это невозможно, то вам придется наследовать оба класса, поскольку они не связаны.

Комментарии:

1. спасибо, Серджио, к сожалению, A уже существует, и я ничего не смог с ним изменить, например, метод append не является виртуальным.

2. Тогда, боюсь, это не сработает, классы, вложенные или нет, не связаны между собой и должны быть реализованы отдельно, это кажется очень хорошей ситуацией, когда функциональность внутреннего вектора должна быть изменена, чтобы обеспечить гораздо больший доступ к его функциональности, чтобы вы могли использовать внешний класс для ее красивой упаковки.

3. вы имеете в виду, что я должен наследовать оба, а также поддерживать область видимости (inner_derived внутри derived), как в примере кода, который я предоставляю?