【发布时间】:2014-08-28 04:58:26
【问题描述】:
我们可以使用限定名称调用构造函数,尽管构造函数没有名称。确实是 3.4.3.2/2:
在不忽略函数名的查找中, 嵌套名称说明符指定了一个 C 类:
— 如果在嵌套名称说明符之后指定的名称,当在 C 中查找时,是 C 的注入类名(第 9 条),或
[...]
该名称被认为是命名类 C 的构造函数。
考虑以下示例:
#include <iostream>
using std::cout;
using std::endl;
struct A
{
virtual void foo()
{
cout << "A" << endl;
}
A(){ }
};
struct B : A
{
virtual void foo()
{
cout << "B" << endl;
}
B()
{
foo();
}
};
struct C : B
{
virtual void foo()
{
cout << "C" << endl;
}
C() : B(){ }
};
C c;
int main()
{
c.foo();
C::C(); // Prints B
}
C::C() 行打印 B。但不清楚。第 12.7/4 节说:
当一个虚函数被直接或间接调用时 构造函数或析构函数,包括在构造过程中或 销毁类的非静态数据成员,以及 object to 调用应用的对象是对象(称为 x)正在建设中或 destruction,调用的函数是 构造函数或析构函数的类,而不是一个覆盖它的类 更多派生类
在显式构造函数中调用c 已经完全构造好了。所以我引用的规则不能用来解释这种行为。是UB吗?你能解释一下吗?
【问题讨论】:
-
C::C();与对象c有什么关系?
标签: c++ constructor