关于虚函数和继承

时间:2016-02-02 13:33:39

标签: c++ c++11 syntax virtual-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;

2 个答案:

答案 0 :(得分:2)

在您的代码中,根本不会调用NSDateComponents *comp = [[NSDateComponents alloc] init]; comp.month = components.month; comp.year = components.year; comp.day = ??; // What should I give here to get the current start date of the week? 。如果你可以调试它,你会发现next->print();在这里为空。

LIVE

修改

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

答案 1 :(得分:1)

  

因为next是A

的静态指针

next不是静态指针。即使您可能从具有静态存储的指针复制初始化它。但是它是否是静态的,与成员函数调用的工作原理无关。

  

为什么要去B的功能?

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

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

next->A::print();

当然,如果你只想使用静态调度,那么首先声明虚函数是没有任何意义的。