Простая проблема наследования в C ++ - PullRequest
2 голосов
/ 04 июля 2011

Я пытаюсь правильно понять наследование в C ++.

Во-первых, нормально ли иметь класс, который возвращает экземпляры самого себя?

class Class1 {
public:   
   Class1 foo();
}

В принципе, у меня есть класс, которыйвыводит уравнения, поэтому берет уравнение и возвращает уравнение.

Если бы я хотел, чтобы некоторые подклассы класса 1 также возвращали свои экземпляры:

class Child : public Class1 {
public:
   Child bar();
}

, и я хотел бы использовать некоторые функциидля Class1, но вместо того, чтобы возвращать Class1, я хотел бы вернуть дочерние объекты, возможно ли это с наследованием?

Спасибо, надеюсь, этот вопрос не слишком тупой.

Ответы [ 3 ]

1 голос
/ 04 июля 2011

Как написано, проблем нет, но как вы собираетесь его использовать. Вернуть по значению включает копирование, а копирование и полиморфизм обычно не идут хорошо вместе Обычно (но есть исключения), предпочтительнее вернуть указатель на недавно выделенный экземпляр. (Вам придется обратиться проблемы управления памятью, если вы делаете это. Если логическое значение класс такой, что циклы невозможны, тогда вы можете использовать std::shared_ptr; в противном случае вам придется заняться чем-то другим.)

1 голос
/ 04 июля 2011

Да,

Мне кажется, что вы описали хорошо определенную проблему, известную на языке Desing Pattern, как Factory.

Примите во внимание следующее:

class Class1 {
public:   
   static Class1 * getInstance( Equation * eq );

   virtual void foo() = 0;
}

class Child : public Class1 {
public:
   virtual void foo();
}

class OtherChild : public Class1 {
public:
   virtual void foo();
}

Вы бы реализовали метод foo () по-разному для обоих детей.

Так, например, вы могли бы:

int main(){

   Equation myEquation("x=y/4");

   Class1 * myInstance = Class1::getInstance ( &myEquation );

   myInstance->foo(); //would call the virtual method of the child class. You don't care what subclass, this was figured out by the "getInstance" method.

}
0 голосов
/ 04 июля 2011

Во-первых, нормально ли иметь класс, который возвращает экземпляры самого себя?

Да, все в порядке, и в вашем случае это звучит как хороший дизайн.У вас может быть дизайн, который вы предложили, или у вас может быть другой дизайн, где ваш класс будет возвращать другой объект, например class DerivedEquation, или у вас также может быть class Deriver, который будет принимать Equation и возвращать Equation.Все эти проекты хороши.

Если бы я хотел, чтобы некоторые подклассы Class1 также возвращали свои экземпляры, и я хотел бы использовать некоторые функции Class1, но вместо того, чтобы возвращать Class1, я бы хотел вернутьДочерние объекты, возможно ли это с наследованием?

Это тоже хорошо.Вы можете иметь Class1::foo() и Child::bar(), как вы и предлагали.Кроме того, если вы не хотите иметь 2 разных имени функции, вы можете изменить определение foo на Class1 * foo() или Class1 & foo(), и тогда вы сможете перегрузить его в Child.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...