    #include<iostream>
    using namespace std;
    
    struct Abstract {
            virtual void pure() = 0;
            virtual void impure() { cout << " Abstract :: impure() " << endl; }
            Abstract() {
                    impure();
                    pure(); // warning. technically undefined
            }
            ~Abstract() {
                    impure();
                    pure(); // warning. technically undefined
            }
    };
    void Abstract :: pure() { cout << " Abstract :: pure()" << endl; }
    struct X : public Abstract {
            virtual void pure() { cout << " X :: pure() " << endl; }
            virtual void impure() { cout << " X :: impure() " << endl; }
    };
    int main() {
            X x;
            x.pure();
            x.impure();
    }