虚拟方法与同一类中的非虚方法

时间:2015-04-08 07:31:57

标签: c++ methods polymorphism virtual

在下面的代码中,我们有两个类,每个类有两个方法:一个是虚拟的,第二个是非虚拟的。我不明白运行此代码时会发生什么。在哪种情况下,使用哪种功能(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

1 个答案:

答案 0 :(得分:1)

如果通过指针或引用调用虚拟方法,则在运行时动态解析虚方法。在所有其他情况下,要调用的函数将在编译时静态解析。

您应该了解虚拟方法的工作原理。简单来说,编译器存储在您的对象指向该类的每个虚拟方法的函数的指针中。通过引用指针调用虚方法时,将调用对象中相应指针指向的函数。因此,调用将在运行时解决

因此,只有function1可以动态调用正确的方法,因为它是唯一一个通过引用而不是按值传递参数的方法。

案例&#34; D&#34;在运行时不解析必须调用方法;它只是选择第二种方法,因为它是在const对象上调用的。即使它不是虚拟的,它也会表现得相同。