1
3
指针是有效的,但是您必须记住,当通过指针调用虚拟函数时,总是按照 动态 左侧使用的对象的类型。这意味着,当您从构造函数调用一个虚拟函数时,不管您是直接调用它还是通过指针调用它。在这两种情况下,调用都将解析为其构造函数当前正在工作的类型。这就是虚拟函数的工作原理,当您在对象构造(或销毁)期间调用它们时。 还请注意,指向成员函数的指针通常不会在初始化时附加到特定函数。如果目标函数不是虚拟的,可以说指针指向一个特定的函数。但是,如果目标函数是虚拟的,就无法确定指针指向何处。例如,语言规范明确指出,当您比较(为了相等)指向虚拟函数的两个指针时,结果是 未指定的 . |
2
3
“valid”是应用于指针时的特定术语。当数据指针指向对象或
然而,从你关于实际输出的问题中,我可以推断出你想问别的问题。让我们看看你的
现在的问题是,取成员函数的地址时是否已经选择了实际的函数。您的实现表明它们不存在,并且只有当指针实际上被取消引用时才会发生这种情况。 原因是 必须 以这种方式工作是微不足道的。获取成员函数的地址不涉及实际的对象,这是解析虚拟调用所需的。让我给你看看:
当我们初始化
|
3
1
读 this article 对于成员函数指针及其使用方法的深入讨论。这应该能回答你所有的问题。 |
4
1
我发现了一些关于 Old New Thing (Raymond Chen的博客,有时被称为微软的Chuck Norris)。 当然,它并没有提到合规性,但它解释了为什么:
1和2实际上调用了一个不同的函数…这真是令人惊讶。它还意味着您不能使用指向成员函数的指针来实际阻止运行时调度:/ |
5
0
我想没有。指向虚拟成员函数的指针是通过vmt解析的,所以调用这个函数的方式是一样的。这意味着它是无效的,因为vmt是在构造函数完成后填充的。 |
6
-1
IMO是
我问了一个相关的问题 here 几个月前,基本上说在C++标准中没有指定虚拟函数的地址。 因此,在任何情况下,即使它适用于您,解决方案也不会是可移植的。 |