在下面的代码中,我们有两个类,每个类有两个方法:一个是虚拟的,第二个是非虚拟的。我不明白运行此代码时会发生什么。在哪种情况下,使用哪种功能(1,2,3)系统使用虚拟或非虚拟功能?对于所有情况,我在评论中写了我在代码运行时获得的内容。我有点困惑......提前致谢
class cFather {
public:
void print( ) { cout<<” 1) cFather\n”;}
virtual void print( ) const { cout<<” 2) cFather\n”};
};
class cSon : public cFather {
public:
virtual void print( ) { cout<<” 3) der\n”; }
void print( ) const { cout<<” 4) der\n”; }
};
void function1 (const cFather& o)
{
o.print( );
}
void function2 (const cFather o)
{
o.print( );
}
void function3(cFather o)
{
o.print( );
}
A)
void main ( )
{ cFather o;
function3(o); }
// 1) CFather
B)
void main ( )
{ cSon t;
function1(t); }
// 4) der
C)
void main ( )
{ cFather * o;
cSon t;
o = &t;
o->print( ); }
// 1) cFather
d)
void main ( )
{ cFather o;
function2(o); }
// 2) cFather
答案 0 :(得分:1)
如果通过指针或引用调用虚拟方法,则在运行时仅动态解析虚方法。在所有其他情况下,要调用的函数将在编译时静态解析。
您应该了解虚拟方法的工作原理。简单来说,编译器存储在您的对象指向该类的每个虚拟方法的函数的指针中。通过引用指针调用虚方法时,将调用对象中相应指针指向的函数。因此,调用将在运行时解决。
因此,只有function1
可以动态调用正确的方法,因为它是唯一一个通过引用而不是按值传递参数的方法。
案例&#34; D&#34;在运行时不解析必须调用方法;它只是选择第二种方法,因为它是在const
对象上调用的。即使它不是虚拟的,它也会表现得相同。