从基类调用虚函数

Gal*_*man 50 c++ polymorphism virtual

说我们有:


Class Base
{   
    virtual void f(){g();};
    virtual void g(){//Do some Base related code;}
};

Class Derived : public Base
{   
    virtual void f(){Base::f();};
    virtual void g(){//Do some Derived related code};
};

int main()
{
    Base *pBase = new Derived;
    pBase->f();
    return 0;  
}

Run Code Online (Sandbox Code Playgroud)

哪个g()会被召唤Base::f()Base::g()还是Derived::g()

谢谢...

Joh*_*itb 55

将调用派生类的g.如果要调用基础中的函数,请调用

Base::g();
Run Code Online (Sandbox Code Playgroud)

代替.如果要调用派生版,但仍希望调用基本版本,请安排派生版本的g在其第一个语句中调用基本版本:

virtual void g() {
    Base::g();
    // some work related to derived
}
Run Code Online (Sandbox Code Playgroud)

在模板方法设计模式中使用这样的事实,即来自基础的函数可以调用虚方法并将控制转移到派生类中.对于C++,它更好地称为非虚拟接口.它在C++标准库中也被广泛使用(例如,C++流缓冲区具有pub...调用实际工作的虚函数的函数.例如pubseekoff调用受保护的seekoff).我在这个答案中写了一个例子:如何验证对象的内部状态?


Sye*_*ani 9

它是Derived :: g,除非你在Base的构造函数中调用g.因为在构造Derived对象之前调用了Base构造函数,所以Derived :: g无法在逻辑上被调用,因为它可能会操作尚未构造的变量,因此将调用Base :: g.


小智 5

pBase是指向基础的指针.pBase = new Derived返回指向Derived - Derived is-a Base的指针.

所以pBase = new Derived是有效的.

pBase引用了一个Base,因此它将Derived视为Base.

pBase-> f()将调用Derive :: f();

然后我们在代码中看到:

Derive :: f() - > Base :: f() - > g() - 但是哪个g ??

好吧,它调用Derive :: g(),因为这是pBase"指向"的g.

答案:Derive :: g()