0

ここで純粋仮想関数「pvf()」を呼び出すにはどうすればよいですか?誰かがこれに光を当ててくれませんか?.................................................。 ............。

#include<iostream>

using namespace std; 

class a
{
public:
    a()
    {
        this->pvf();
        this->p();
    }

    virtual int pvf() = 0;

    virtual void p()
    {
        cout << "\n p fun";
    }
};

int a::pvf()
{
    cout<<"\n pure";
}

class b : public a
{
    int i,j,k;

    void o()
    {
        cout<<"\n der";
    }
};

int main()
{
    //b b1; 
}
4

3 に答える 3

6

型のコンストラクター内ではa、オブジェクトはまだ型aです。そこにある仮想関数を呼び出すと、階層内の以下のオーバーライドがディスパッチされません。aこれは、this->pf();内部の呼び出しa::a();が失敗することを意味します。

本当に呼び出したい場合はa::pf、その呼び出しの動的ディスパッチを無効にする必要があります。これを行うには、追加の資格を追加します:(a::pf()またはthis->a::pf();

于 2013-02-19T18:29:44.103 に答える
2

純粋ではないpfので、私はあなたが意味すると思います。p非仮想呼び出しを指定することで呼び出すことができます。

this->a::pf();

あるいは、派生クラスからおそらく欠落しているオーバーライドではなく、コンストラクターから呼び出されている純粋仮想関数を観察するのはなぜですか?

コンストラクタまたはデストラクタから仮想関数を呼び出すと、最終的な派生クラスではなく、現在構築されているクラスに従って関数が選択されます。関数が現在のクラスで純粋である場合、動作は未定義です。実装がある場合は純粋関数を呼び出すか、他のオーバーライドを呼び出すか、クラッシュするか、または想像できる他の何かを呼び出す可能性があります。

于 2013-02-19T18:26:57.217 に答える
0
#include<iostream>

using namespace std; 

class a
{
public:
    a()
    {

    }

    virtual int pvf() = 0;

    virtual void p()
    {
        cout << "\n p fun";
    }
};

int a::pvf()
{
    cout<<"\n pure";
}

class b : public a
{
    public:
    int i,j,k;

    int pvf(){cout<<" b pvf ";
    }
};

int main()
{
    b b; 
    b.a::pvf();

}
于 2013-02-24T06:18:13.127 に答える