Почему работает вызов print () из указателя на базовый класс (класс A), а вызов print () из объекта дочернего класса (класс C) не работает?
Оператор 1: выдаст «print A» в качестве вывода, так как A :: print () является виртуальным
Функция будет вызывать функцию print () класса C, которая унаследована от A :: print (). Это докажет, что класс C действительно имеет функцию print ()
Заявление 2: Это даст ошибку компилятора, так как B :: print (int x) будет скрывать
A :: печать ().
Оператор 3: выдаст ошибку компиляции. Почему?
Возможно, потому что print () все еще скрыт в классе C, поскольку класс C также наследует B :: print (int x). Если это так, то почему сработал вызов из a-> print ()?
Другой вопрос: существует ли какое-либо правило, которое указывает, что B :: print (int x) будет скрывать A :: print () в дочерних классах?
class A{
public:
virtual void print();
};
void A::print(){
cout<<"print A\n";
}
class B:public A{
public:
void print(int x);
};
void B::print(int x){
cout<<"print B " << x <<"\n";
}
class C:public B{
};
void funca(A *a){
a->print();//Statement 1
}
void funcb(B *b){
//b->print(); Statement 2
}
void funcc(C *c){
//c->print(); Statement 3
}
int main(){
C d;
funca(&d);
funcb(&d);
funcc(&d);
}