C++虚函数行为
C++ virtual function behavior
我正在根据我的理解做一些练习。在编译下面的代码时,我得到 Derived::disp() 调用,它又调用非虚函数 "Print".
我的问题是即使 "Print" 不是虚拟的,为什么调用 Derived class "Print"version 而不是 Base print version。
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();
}
输出:
Derived::Disp()
Derived::Print()
如果您在(虚拟或非虚拟)成员函数内调用非虚拟函数,则调用该 class 的成员函数。
如果您要在 main 中调用 pB->print()
,它会调用 Base::Print
。但就目前而言,pB->Disp()
调用 Derived::Disp()
调用 Derived::Print
的基础是它是从 Derived
class.
内部调用的
在非静态成员函数的主体中,关键字 this
具有指向调用该函数的 class 类型对象的指针类型。
如果为派生 class 调用虚函数,则 this
具有此 class 的指针类型。
内部成员函数访问 class 成员在您的程序上下文中查找例如
( *this ).print();
其中 this
的类型为 Derived *
.
因此调用了这个class的成员函数print
。
我正在根据我的理解做一些练习。在编译下面的代码时,我得到 Derived::disp() 调用,它又调用非虚函数 "Print".
我的问题是即使 "Print" 不是虚拟的,为什么调用 Derived class "Print"version 而不是 Base print version。
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();
}
输出:
Derived::Disp()
Derived::Print()
如果您在(虚拟或非虚拟)成员函数内调用非虚拟函数,则调用该 class 的成员函数。
如果您要在 main 中调用 pB->print()
,它会调用 Base::Print
。但就目前而言,pB->Disp()
调用 Derived::Disp()
调用 Derived::Print
的基础是它是从 Derived
class.
在非静态成员函数的主体中,关键字 this
具有指向调用该函数的 class 类型对象的指针类型。
如果为派生 class 调用虚函数,则 this
具有此 class 的指针类型。
内部成员函数访问 class 成员在您的程序上下文中查找例如
( *this ).print();
其中 this
的类型为 Derived *
.
因此调用了这个class的成员函数print
。