Conforme hierarquia de classes da figura acima, foi definido um método void f() nas quatro classes — A, B, C e D —, de tal maneira que a função f( ) de cada classe chame somente uma vez a função f( ) de cada um de seus antecessores na ordem hierárquica mostrada, de baixo para cima. O código que implementa essas classes está descrito a seguir.
class A {
protected:
void f_( ) {...}
public:
virtual void f() {f_();}
};
class B: public A {
protected:
void f_( ) {…}
public:
virtual void f() {A::f_(); f_();}
};
class C:public A {
protected:
void f_( ) {…}
public:
virtual void f( ) {A::f_( ); f_( );}
};
class D: public B, public C {
protected:
void f_( ) {…}
public:
void f( ) {B::f_( ); C::f_( ); f_( );}
};
Considerando as informações do texto ao lado, julgue o item seguinte.
Um compilador C++ que encontre a chamada
A a;
B b;
C c;
if (...) a=&b; else a=&c;
a->f( );
definirá para cada objeto um atributo oculto que indicará à qual das três classes pertence (exemplo: A=0, B=1, C=2); construirá um vetor dinâmico pf de ponteiros às três funções A::f( ), B::f( ), C::f( ); e gerará uma chamada indireta ao pf[0].