根据我的理解,我正在做一些练习。在编译下面的代码时,我得到了派生::disp()调用,然后调用非虚拟函数"Print“。
我的问题是,为什么调用派生类" print“版本而不是基打印版本,即使”Print“不是虚拟的。
class Base
{
public:
void print(){
cout<<"Base::Print()\n";
}
virtual void disp(){
cout<<"Base::Disp()\n";
}
};
class Derived: public Base
{
public:
void print(){
cout<<"Derived::Print()\n";
}
void disp(){
cout<<"Derived::Disp()\n";
print();
}
};
void main()
{
Base *pB = new Derived();
pB->disp();
}产出:
派生::Disp()
派生:Print()
发布于 2015-12-06 08:50:22
如果在(虚拟或非虚拟)成员函数中调用非虚拟函数,则调用该类的成员函数。
如果要在main中调用pB->print(),它将调用Base::Print。但就其本身而言,pB->Disp()调用Derived::Disp(),它调用Derived::Print的基础是从Derived类中调用它。
发布于 2015-12-06 09:11:39
在非静态成员函数的主体中,关键字this具有指向调用函数的类类型对象的指针类型。
如果为派生类调用虚拟函数,则this具有该类指针的类型。
在成员函数内部,对类成员的访问将例如在程序的上下文中查找如下
( *this ).print();其中this的类型为Derived *。
因此,调用该类的成员函数print。
https://stackoverflow.com/questions/34115599
复制相似问题