如何调用纯虚函数?

时间:2013-02-19 18:21:31

标签: c++ pure-virtual

如何在这里调用纯虚函数“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; 
}

3 个答案:

答案 0 :(得分:6)

a类型的构造函数中,对象仍为a类型。对虚拟函数的任何调用都将在 中调度层次结构中的任何覆盖文件a。这意味着this->pf();内的通话a::a();将失败。

如果您确实想要拨打a::pf,那么您必须为该通话禁用动态调度,并通过添加额外资格来实现:a::pf()(或this->a::pf();

答案 1 :(得分:2)

我认为你的意思是pf,因为p并不纯粹。您可以通过指定非虚拟呼叫来呼叫它:

this->a::pf();

或许你在问,为什么你会观察到从构造函数中调用的纯虚函数,而不是派生类中可能缺少的覆盖?

从构造函数或析构函数中调用虚函数根据当前构造的类选择函数,而不是根据最终的派生类。如果函数在当前类中是纯函数,则行为是未定义的 - 如果它具有实现,则可以调用纯函数,或者调用其他覆盖,崩溃或者您可以想象的任何其他内容。

答案 2 :(得分: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();

}