Я думаю, что я действительно немного запутался в объектах и в том, что происходит, когда вы расширяете объект.
Моя цель здесь - создать B (), расширив A ()), чтобы получить все функции A () и т.д., но сделать B () полностью самодостаточным в создании самого себя и т.д.
B (), когда экземпляр создается из какого-то места, в конечном итоге настраивает свой цвет, размер, настраивает свое положение и т.д., чтобы я мог сделать что-то вроде:
B::B *b = new B:B(something in);
this -> addChild(b, 1);
Итак, когда this-> addChild () он затем добавляет, и все работает, как я установил в B ()
Против:
B::B *b = new B:B(something in);
b->setPosition();
b->setColor();
...
this -> addChild(b, 1);
В инкапсуляции и наследовании?
ОБНОВЛЕНИЕ: Я думаю, что меня смущает то, что если:
class A : public Z {
}
class b : public Z {
}
В:
B::B *b = new B::B()
this-> addChild(b,1)
Разве это не должно работать?
1 ответ
Вы не расширяете, а составляете композицию.
Если вы хотите расширить класс B из A (чтобы вы получили все защищенные и общедоступные методы в A), вам необходимо определить B следующим образом:
class B : public A { ... }
Если вы хотите, чтобы A было внутри B, вы должны просто прояснить ситуацию для читателя. Оба варианта не имеют значения, если не ясно. В вашем случае я бы предпочел первый, поскольку addChild кажется всего лишь одной операцией.
РЕДАКТИРОВАТЬ: Хорошо, после вашего редактирования да, он должен работать. Но нет необходимости помещать B :: B, если B не находится внутри пространства имен B. Просто вызовите new B (), new A ():
A *a = new A(..);
Некоторые URI: - Предпочитать композицию наследованию? - http://en.wikipedia.org/wiki/Composition_over_inheritance
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .