0

ポインターから基本クラス (クラス 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);
}
4

2 に答える 2