相同的虚拟方法与非虚拟方法 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 对象上调用的。即使它不是虚拟的,它的行为也是一样的。