关于以下代码:
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()
?由于next
是A
的静态指针,为什么它会转到B
的函数?
编辑:添加了我在发帖时意外删除的B c;
。
答案 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();
在这里为空。
修改
使用您编辑的代码,该过程将是无限的。 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();
当然,如果你只想使用静态调度,那么首先声明虚函数是没有任何意义的。