相同的虚拟方法与非虚拟方法 class
virtual method vs non virtual method in the same class
在下面的代码中,我们有两个类,每个都有两个方法:一个是虚拟的,第二个是非虚拟的。我不明白当我 运行 这段代码时到底发生了什么。在哪种情况下,系统使用哪个函数 (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
虚拟方法在运行时动态解析仅 如果您通过指针或引用调用它。在所有其他情况下,要调用的函数将在编译时静态解析。
您应该了解虚拟方法的工作原理。简而言之,编译器会在您的对象中存储 指向 class 的每个虚方法 的函数指针。当您通过引用指针调用虚方法时,将调用对象中相应指针指向的函数。因此,调用将在运行时解析。
因此,只有 function1
可以动态调用 correct 方法,因为它是唯一一个通过引用而不是通过值传递参数的方法。
案例 "D" 未在运行时解决,必须调用方法;它只是选择了第二种方法,因为它是在 const
对象上调用的。即使它不是虚拟的,它的行为也是一样的。
在下面的代码中,我们有两个类,每个都有两个方法:一个是虚拟的,第二个是非虚拟的。我不明白当我 运行 这段代码时到底发生了什么。在哪种情况下,系统使用哪个函数 (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
虚拟方法在运行时动态解析仅 如果您通过指针或引用调用它。在所有其他情况下,要调用的函数将在编译时静态解析。
您应该了解虚拟方法的工作原理。简而言之,编译器会在您的对象中存储 指向 class 的每个虚方法 的函数指针。当您通过引用指针调用虚方法时,将调用对象中相应指针指向的函数。因此,调用将在运行时解析。
因此,只有 function1
可以动态调用 correct 方法,因为它是唯一一个通过引用而不是通过值传递参数的方法。
案例 "D" 未在运行时解决,必须调用方法;它只是选择了第二种方法,因为它是在 const
对象上调用的。即使它不是虚拟的,它的行为也是一样的。