代码之家  ›  专栏  ›  技术社区  ›  bobber205

虚拟方法问题

  •  4
  • bobber205  · 技术社区  · 16 年前

    如果两个方法都声明为virtual,那么调用的Method1()的两个实例不都应该是派生类的Method1()吗?

    我每次都看到基地呼叫。我正在为面试做一些复习,我想确保我的话是直截了当的。除息的

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


    方法1

    5 回复  |  直到 16 年前
        1
  •  6
  •   Dima    16 年前

    你在这里看到的叫做 "slicing"

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

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

    或者你也可以

    
    BaseClass *pBase = new DerClass;
    pBase->Method1();
    
    
        2
  •  14
  •   CB Bailey    16 年前

    不,“C型”演员 ((BaseClass)myClass) 创建临时 BaseClass 对象 我的班级。它的动态类型是 ,它不是一个 DerClass 总之 Method1 被调用的是基类方法。

    myClass.Method1() 是直拨电话。作为 myClass

        3
  •  12
  •   anon anon    16 年前

        4
  •  5
  •   In silico    16 年前

    因为演员 ((BaseClass)myClass) 切片 myClass 对象来自 DerClass BaseClass 基类 的实施 Method1()

    DerClass myClass; 
    BaseClass* ptrToMyClass = &myClass;
    ptrToMyClass->Method1(); // Calls the DerClass implementation of Method1()
    

    或参考资料:

    DerClass myClass; 
    BaseClass& refToMyClass = myClass;
    refToMyClass.Method1();  // Calls the DerClass implementation of Method1()
    
        5
  •  0
  •   Mukul Kashmira    11 年前

    真正的多态行为是通过基类指针实现的,基类指针可以包含派生类的任何对象。 ((基类*)&myClass)—>方法1();