关于虚拟方法的问题

bob*_*205 4 c++ methods virtual-functions

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

我看到BASE然后每次调用DERIVED.我正在为面试做一些评论,我想确保我有这个直接.的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();
Run Code Online (Sandbox Code Playgroud)

方法1 BASE
方法1 DERVIED

CB *_*ley 14

不,"C风格"演员通过切片 myClass ((BaseClass)myClass)创建一个临时BaseClass对象.它的动态类型是,它根本不是所以被调用的是基类方法.BaseClassDerClassMethod1

myClass.Method1()是一个直接的电话.作为myClass一个对象,而不是引用,没有虚拟分派(没有必要).


小智 12

不,因为虚函数机制仅在通过指针或引用调用函数时才有效.否则,对象的静态类型用于确定要调用的函数.


Dim*_*ima 6

你在这里看到的被称为"切片".将派生类的对象强制转换为基类"切掉"不在基类中的所有内容.

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


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

或者你可以做到


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


In *_*ico 5

因为((BaseClass)myClass)强制转换将myClass对象切割DerClassBaseClass,所以只调用了它BaseClass的实现Method1().

要使多态性正常工作,必须通过指针调用方法:

DerClass myClass; 
BaseClass* ptrToMyClass = &myClass;
ptrToMyClass->Method1(); // Calls the DerClass implementation of Method1()
Run Code Online (Sandbox Code Playgroud)

或参考:

DerClass myClass; 
BaseClass& refToMyClass = myClass;
refToMyClass.Method1();  // Calls the DerClass implementation of Method1()
Run Code Online (Sandbox Code Playgroud)