7

重複の可能性:
基本クラスのポインターを介して派生クラスのプライベート仮想メソッドを呼び出すことが許可されているのはなぜですか?

最近、私は奇妙な質問に遭遇しました。plzは次のコードを参照しています。

#include <iostream>

using namespace std;

class A
{
    public:
        virtual void disp() {
            cout<<"A disp"<<endl;
        }

};

class B : public A
{
    private:
        void disp() {
            cout<<"B disp"<<endl;
        }
};

int main()
{
    A a;
    a.disp();

    A *b = new B();
    b->disp();
}

出力は次のとおりです。

A disp
B disp

なぜポインタbがdisp()にアクセスできるのか疑問に思いますか?それは私用です!ではない?

4

2 に答える 2

7

disp()は、A *を介して呼び出しているためパブリックであり、disp()はAでパブリックとして宣言されています。仮想であるため、Bのバージョンのdispが呼び出されますが、パブリックかプライベートかに影響しません。

于 2012-08-16T12:22:59.667 に答える
1

それは言語設計によるものです。ただし、導出時にメソッド保護レベルを強化することは悪い習慣です

于 2012-08-16T12:23:10.447 に答える