| // { dg-do run } |
| // prms-id: 16146 |
| |
| extern "C" int printf (const char *, ...); |
| |
| class myFoundation { |
| protected: |
| myFoundation () { count = 0; }; |
| virtual ~myFoundation () {}; |
| |
| public: |
| void addRef () { ++count; } |
| void removeRef () { if (count > 0) --count; } |
| |
| private: |
| long count; |
| }; |
| |
| |
| class firstIntermediate :virtual public myFoundation { |
| public: |
| firstIntermediate () {}; |
| ~firstIntermediate () {}; |
| |
| void bar () { printf ("Bar\n"); } |
| }; |
| |
| |
| class firstBase : public firstIntermediate { |
| public: |
| firstBase () {}; |
| ~firstBase () {}; |
| |
| virtual void g () {}; |
| }; |
| |
| |
| class secondIntermediate : virtual public myFoundation { |
| public: |
| secondIntermediate () {}; |
| ~secondIntermediate () {}; |
| |
| virtual void h () {}; |
| }; |
| |
| |
| class secondBase : public secondIntermediate { |
| public: |
| secondBase () {}; |
| ~secondBase () {}; |
| |
| virtual void h () {}; |
| }; |
| |
| |
| class typeInterface : virtual public firstBase { |
| public: |
| typeInterface () {}; |
| ~typeInterface () {}; |
| |
| virtual void i () {}; |
| }; |
| |
| class classServices : virtual public firstBase, |
| public secondBase { |
| public: |
| classServices () {}; |
| ~classServices () {}; |
| |
| virtual void j () {}; |
| }; |
| |
| class classImplementation : public typeInterface, |
| public classServices { |
| public: |
| classImplementation () {}; |
| ~classImplementation () {}; |
| |
| void g () {}; |
| void h () {}; |
| void i () {}; |
| void j () {}; |
| }; |
| |
| int main () { |
| firstBase* fbp = new classImplementation; |
| classImplementation* cip = dynamic_cast <classImplementation*> (fbp); |
| cip->addRef(); |
| myFoundation* mfp = cip; |
| } |