#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), как в примере кода, который я предоставляю?