Can unnamed structures inherit?

后端 未结 2 908
遥遥无期
遥遥无期 2021-02-11 16:06

The following looks like a compilation error :

struct : Base { };

Yet when used [1] it seems to work :

#include <         


        
相关标签:
2条回答
  • 2021-02-11 16:43

    Your first example, because it doesn't declare anything, shows an attempt at an anonymous struct (which is not allowed - 7/3) rather than an unnamed one (which is).

    The grammar in 9/1 of the C++11 standard seems to allow an unnamed class to have a base, so I think your second example is fine.

    0 讨论(0)
  • 2021-02-11 16:57

    Unnamed classes can inherit. This is useful, for example, in situations when you must inherit in order to override a virtual function, but you never need more than one instance of the class, and you do not need to reference the derived type, because a reference to the base type is sufficient.

    Here is an example:

    #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;
    }
    

    This code creates four anonymous derivations of Base - one for each operation. When the instances of these derivations are passed to the perform function, the proper override is called. Note that perform does not need to know about any of the specific types - the base type with its virtual function is enough to complete the process.

    Here is the output of running the above code:

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

    Demo on ideone.

    0 讨论(0)
提交回复
热议问题