虚拟方法的问题 [英] Question on Virtual Methods

查看:157
本文介绍了虚拟方法的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



如果两个方法都声明为虚拟的,我不会同时调用Method1()的两个实例作为派生类的Method1然后DERIVED每次调用。我正在做一些面试的审查,我想确保我有这个直。 xD

  class BaseClass 
{
public:
virtual void Method1(){cout< ;& 方法1 BASE< endl }
};

class DerClass:public BaseClass
{
public:
virtual void Method1(){cout< 方法1 DERVIED< endl }
};


DerClass myClass;
((BaseClass)myClass).Method1();
myClass.Method1();




方法1 BASE

方法1 DERVIED



解决方案

这里看到的是切片



在C ++中,虚函数仅适用于指针或引用。为了使您的示例正常工作,您必须执行以下操作:

 

DerClass myClass;
((BaseClass *)&myClass) - > Method1();



p>

 

BaseClass * pBase = new DerClass;
pBase-> Method1();


IF both methods are declared as virtual, shouldn't both instances of Method1() that are called be the derived class's Method1()?

I am seeing BASE then DERIVED called each time. I am doing some review for an interview and I want to make sure I have this straight. xD

class BaseClass
{
public:
    virtual void Method1()  { cout << "Method 1 BASE" << endl; }
};

class DerClass: public BaseClass
{
public:
    virtual void Method1() { cout << "Method 1 DERVIED" << endl; }
};


DerClass myClass;
    ((BaseClass)myClass).Method1();
    myClass.Method1();

Method 1 BASE
Method 1 DERVIED

解决方案

What you are seeing here is called "slicing". Casting an object of the derived class to the base class "slices off" everything that is not in the base class.

In C++ virtual functions work correctly only for pointers or references. For your example to work right, you have to do the following:


DerClass myClass;
((BaseClass *) &myClass)->Method1();

Or you could do


BaseClass *pBase = new DerClass;
pBase->Method1();

这篇关于虚拟方法的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆