【问题标题】:virtual method vs non virtual method in the same class同一类中的虚拟方法与非虚拟方法
【发布时间】:2015-06-13 01:14:49
【问题描述】:

在下面的代码中,我们有两个类,每个类都有两个方法:一个是虚拟的,第二个是非虚拟的。我不明白当我运行这段代码时到底发生了什么。在哪种情况下,系统使用哪个功能(1,2,3)使用虚拟功能或非虚拟功能?对于所有情况,我在 cmets 中写入了代码运行时获得的内容。我有点困惑......提前谢谢

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( ); 
} 

一)

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

【问题讨论】:

  • 这不是“唯一的区别”;一个是 const,另一个不是。
  • 您不了解具体的哪些行为?
  • 你说得对,我修改了!!
  • 我不明白为什么例如在案例A中,我们使用非虚拟方法,为什么不使用虚拟方法?
  • 因为o 是非常量。

标签: c++ methods polymorphism virtual


【解决方案1】:

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

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

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

案例“D”在运行时没有解决,必须调用方法;它只是选择第二种方法,因为它是在 const 对象上调用的。即使它不是虚拟的,它的行为也会相同。

【讨论】:

  • 我知道,但是为什么在情况D中,系统以虚拟机为例?
  • @Laura :它不使用虚拟的,因为它是virtual,而是因为它是const
  • 感谢您的回复...您帮了我很多
猜你喜欢
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
相关资源
最近更新 更多