关于虚函数和继承
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()
?由于next
是A
的静态指针,为什么它会转到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
在这里是空的。
编辑
使用您编辑的代码,该过程将是无限的。 next->print();
会导致B::print()
,虽然next
的静态类型是A*
,但是A::print()
是虚函数,而next
是实际上指向 B
的一个实例,所以动态多态在这里起作用。
关于以下代码:
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;
,我在发帖时不小心删除了它。
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
在这里是空的。
编辑
使用您编辑的代码,该过程将是无限的。 next->print();
会导致B::print()
,虽然next
的静态类型是A*
,但是A::print()
是虚函数,而next
是实际上指向 B
的一个实例,所以动态多态在这里起作用。