Listing 2: Test case for GenericInstrument and Configuration classes

 1: #include "instrument.h" 
 2: #include <new.h>  // for placement new 
 3: #include <iostream.h> 
 4: #include <assert.h> 
 5: 
 6: class Piano : public Instrument { 
 7:    int attr; // an attribute 
 8: public:  
 9:    Piano() {  
10:       assert(sizeof(*this) <= sizeof(GenericInstrument));  
11:    } 
12:    virtual void playNote(Note key);  
13: }; 
14: 
15: class Violin : public Instrument { 
16:    int attr1; // an attribute 
17:    int attr2; // another attribute 
18: public:  
19:    Violin() { 
20:       assert(sizeof(*this) <= sizeof(GenericInstrument));  
21:    } 
22:    virtual void playNote(Note key);  
23: }; 
24: 
25: void Piano::playNote(Note key) { 
26:     cout << "Piano " << key << endl;  
27: } 
28: 
29: void Violin::playNote(Note key) { 
30:     cout << "Violin " << key << endl;  
31: } 
32: 
33: static Configuration c1, c2; 
34: 
35: int main() { 
36:    new(&c1.i) Piano; // instantiate Piano 
37:    c1.i.playNote('c'); 
38:    memcpy(&c2, &c1, sizeof(Configuration));  
39:    static_cast<Instrument *>(&c2.i)->playNote('d');  
40:     
41:    new(&c1.i) Violin; // instantiate Violin 
42:    c1.i.playNote('e');  
43:    c1 = c2; // Oops, doesn't copy the v-pointer! 
44:    c1.i.playNote('f'); 
45: 
46:    return 0;  
47: }