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