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,对象仍然是 type 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 回答