关于虚函数和继承

About virtual function and inheritance

关于以下代码:

class A {
    A * next;
    static A* tmp;
public:
    A() : next(tmp) {
        if (tmp)
            tmp->next = this;
        tmp = this;

    }
    virtual void print() {
        if (next)
            next->print();
    }
};
class B : public A {
    int a = 1;
public:
    void print() {
        cout << "foo";
        A::print();
    }
};
A* A::tmp;
int main(){
    B c;
    B b;
    b.print();
}

为什么 next->print(); 导致 B::print() 而不是返回 A::print()?由于nextA的静态指针,为什么它会转到B的函数?

编辑:添加了 B c;,我在发帖时不小心删除了它。

Since next is a static pointer of A

next 不是 static 指针。即使您可能已经从具有静态存储的指针对其进行了复制初始化。但是是否是static与成员函数调用如何工作无关。

why does it go to B's function?

因为print是虚函数。如果指针 A* next 指向 B 的实例,那么 next->print() 将调用 B::print()。这称为虚拟或动态调度。

如果您想改为调用 A::print(),那么您可以使用静态调度:

next->A::print();

当然,如果您只想使用静态分派,那么一开始就将函数声明为虚函数没有任何意义。

在您的代码中,根本不会调用 next->print();。如果你可以调试它,你会发现 next 在这里是空的。

LIVE

编辑

使用您编辑的代码,该过程将是无限的。 next->print();会导致B::print(),虽然next的静态类型是A*,但是A::print()是虚函数,而next是实际上指向 B 的一个实例,所以动态多态在这里起作用。