Por supuesto, usted puede usar la composición y la herencia a la vez. El siguiente ejemplo muestra la creación de una clase más compleja utilizando composición y herencia.
//: C14:Combined.cpp // Inheritance & composition class A { int i; public: A(int ii) : i(ii) {} ~A() {} void f() const {} }; class B { int i; public: B(int ii) : i(ii) {} ~B() {} void f() const {} }; class C : public B { A a; public: C(int ii) : B(ii), a(ii) {} ~C() {} // Calls ~A() and ~B() void f() const { // Redefinition a.f(); B::f(); } }; int main() { C c(47); } ///:~
Listado 14.6. C14/Combined.cpp
C hereda de B y tiene un objeto miembro ("esta compuesto de") del tipo A. Puede comparar que la lista de inicializadores contiene las llamadas al constructor de la clase base y las constructores de los objetos miembros.
La función C::f() redefine B::f(), que era heredada, y también llama a la versión de la clase base. Además, se llama a a.f(). Fíjese que durante todo este tiempo estamos hablando acerca de la redefinición de funciones durante la herencia; con un objeto miembro que sólo se puede manipular su interfaz pública, no redefinirla. Además, al llamar a f() en un objeto de la clase C no podrá llamar a a.f() si C::f() no ha sido definido, mientras que sería posible llamar a B::f().
Aunque muy a menudo sea necesario realizar llamadas explicitas a los constructores en la inicialización, nunca será necesario realizar una llamada explicita a los destructores porque sólo existe un destructor para cada clase y éste no tiene parámetros. Sin embargo, el compilador asegura que todos los destructores son llamados, esto significa que todos los destructores de la jerarquía, desde el destructor de la clase derivada y retrocediendo hasta la raíz, serán ejecutados.
Es necesario destacar que los constructores y destructores son un poco inusuales en el modo en que llaman a su jerarquía, en una función miembro normal sólo la función en si es llamada, ninguna versión de la clase base. Si usted desea llamar a la versión de la clase base de una función miembro normal, deberá sobrecargarla y deberá llamarla explícitamente.