Answers:
首先,我们将采用沼泽标准的抽象UDT(用户定义类型):
struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'
让我们还记得,我们可以在定义它的同时实例化UDT:
struct foo { foo() { cout << "!"; } }; // just a definition
struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"
让我们结合示例,回想一下我们可以定义一个没有名称的UDT :
struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'
我们不再需要有关匿名UDT的证明,因此我们可能会丢失纯虚函数。同样重命名instance
为foo
,我们还有:
struct {} foo;
越来越接近。
现在,如果此匿名UDT是从某个基础派生的呢?
struct bar {}; // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof
最后,C ++ 11引入了扩展的初始化程序,这样我们就可以使诸如此类的事情变得混乱:
int x{0};
还有这个:
int x{};
最后,这是:
struct : bar {} foo {};
这是一个源自bar的未命名结构,使用空白初始化程序实例化为foo。