ポインターから基本クラス (クラス A) への print() の呼び出しが機能し、子クラス オブジェクト (クラス C) からの print() の呼び出しが機能しないのはなぜですか?
ステートメント 1: A::print() は、A::print() から継承されたクラス C の print() 関数を呼び出す仮想関数であるため、出力として「print A」を提供します。これは、クラス C が実際に print() 関数を持っていることを証明します。
ステートメント 2: B::print(int x) は A::print() を非表示にするため、コンパイラ エラーが発生します。
ステートメント 3: コンパイル エラーが発生します。なんで?
おそらく、クラス C も B::print(int x) を継承しているため、print() がまだクラス C に隠されているためです。この場合、なぜ 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);
}