关于C++中虚函数的访谈问题

Vij*_*jay 20 c++ virtual

我被问到这个疯狂的问题.我失去了智慧.

可以使用指向派生类对象的基类指针调用声明为virtual的基类中的方法吗?

这可能吗?

Ala*_*lan 50

如果您尝试从基类指针调用虚方法,是的.

这是多态性.

如果您要求使用指向派生类的基类指针,您是否可以调用派生类重写的基类方法?是的,通过显式确定基类名称也可以:

basePtr->BaseClass::myMethod();

  • 嗯,写的问题令人困惑. (5认同)
  • 多态性是派生类方法的类,因为该方法在基类中是虚拟的.实际上,即使基类方法被覆盖,也通过指向base的指针调用基类方法绕过不同的多态. (4认同)

el.*_*ado 16

尝试:

class A            { virtual void foo(); }
class B : public A { virtual void foo(); }

A *b = new B();
b->A::foo ();
Run Code Online (Sandbox Code Playgroud)

  • 实际上我认为它应该是"A*b = new B()"而不是"B*b = new B()"来跟随这个问题. (4认同)

CB *_*ley 10

你的意思是这样的.(pBase指向基类型的类型,但指向的对象实际上Derived是派生自的类型Base.)

pBase->Base::method();
Run Code Online (Sandbox Code Playgroud)

是的,这是可能的.


Jer*_*fin 10

是 - 您必须指定全名:

#include <iostream>

struct base { 
    virtual void print() { std::cout << "Base"; }
};

struct derived : base {
    virtual void print() { std::cout << "Derived"; }
};

int main() { 
    base *b = new derived;
    b->base::print();
    delete b;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Kei*_*thB 5

如果我正确理解了这个问题,你就有了

class B 
{
public: 
    virtual void foo();
};

class D: public B
{
public:
    virtual void foo();
}

B* b = new D;
Run Code Online (Sandbox Code Playgroud)

问题是,你能打电话吗B::foo()?答案是肯定的,使用

b->B::foo()
Run Code Online (Sandbox Code Playgroud)