33

以下看起来像一个编译错误:

struct : Base { };

然而,当使用 [1]时,它似乎可以工作:

#include <iostream>
using namespace std;

template<bool B>
struct A 
{
    struct : std::integral_constant<bool, B> {
    } members;
};

int main()
{
    A<true> a;    
    cout << a.members.value << endl;
    return 0;
}

在 C++ 中,未命名的结构可以继承吗?有什么有用的例子吗?


[1]免责声明:我并没有假装提供的示例很有用。我很少使用未命名的结构,当我这样做时,它们通常会捆绑一些内置的成员变量,以便为类提供更清晰的接口。这个问题来自于成员空间不需要命名结构的观察

4

2 回答 2

43

未命名的类可以继承。这很有用,例如,在您必须继承以覆盖虚函数但您永远不需要多个类的实例并且不需要引用派生类型的情况下,因为对基类的引用类型就足够了。

这是一个例子:

#include <iostream>
using namespace std;

struct Base {virtual int process(int a, int b) = 0;};
static struct : Base {
    int process(int a, int b) { return a+b;}    
} add;
static struct : Base {
    int process(int a, int b) { return a-b;}    
} subtract;
static struct : Base {
    int process(int a, int b) { return a*b;}    
} multiply;
static struct : Base {
    int process(int a, int b) { return a/b;}    
} divide;

void perform(Base& op, int a, int b) {
    cout << "input: " << a << ", " << b << "; output: " << op.process(a, b) << endl;
}

int main() {
    perform(add, 2, 3);
    perform(subtract, 6, 1);
    perform(multiply, 6, 7);
    perform(divide, 72, 8);
    return 0;
}

此代码创建四个匿名派生Base- 每个操作一个。当这些派生的实例被传递给perform函数时,会调用适当的覆盖。请注意,perform不需要了解任何特定类型 - 具有其虚函数的基本类型足以完成该过程。

这是运行上述代码的输出:

input: 2, 3; output: 5
input: 6, 1; output: 5
input: 6, 7; output: 42
input: 72, 8; output: 9

ideone 上的演示。

于 2014-06-01T12:33:20.077 回答
9

你的第一个例子,因为它没有声明任何东西,显示了一个匿名结构的尝试(这是不允许的 - 7/3)而不是一个未命名的结构(这是)。

C++11 标准的 9/1 中的语法似乎允许一个未命名的类有一个基础,所以我认为你的第二个例子很好。

于 2014-06-01T12:30:45.613 回答