如何调用纯虚拟函数

How do I invoke the pure virtual function?

本文关键字:虚拟 函数 调用 何调用      更新时间:2023-10-16

如何在此处调用纯虚拟函数"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; 
}

a类型的构造函数中,对象的类型仍然是a。对那里的虚拟函数的任何调用都不会被调度到层次结构中a以下的任何覆盖器。这意味着a::a();内部的调用this->pf();将失败。

如果您真的想调用a::pf,那么您必须禁用该调用的动态调度,并通过添加额外的限定来实现:a::pf()(或this->a::pf();

我假设你指的是pf,因为p不是纯的。您可以通过指定非虚拟调用来调用它:

this->a::pf();

或者你可能在问,为什么你观察到从构造函数调用的纯虚拟函数,而不是派生类中可能缺少的任何重写?

从构造函数或析构函数调用虚拟函数是根据当前构造的类而不是最终派生的类来选择函数的。如果函数在当前类中是纯函数,那么行为是未定义的——如果它有实现,它可能会调用纯函数,或者调用其他重写、崩溃或其他任何你能想象到的事情。

#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();
}