
#include<iostream>
using namespace std;

class Base {
protected:
   int x;
public:
    Base(int i) : x(i) { }
    virtual void fun() = 0;
    virtual void show() = 0;
    int getX() { return x; }
};

// This class inherits from Base and implements fun()
class Derived: public Base {
    int y;
public:
    //Derived() {}
    Derived(int i, int j):Base(i), y(j) { }
    void fun() {
        cout << "fun() called" << endl;
        cout << "x = " << x << ", y = " << y;
    }
    void show() { cout << "In Derived \n" << endl; }

};

class Test {
   int x;
public:
    virtual void show() = 0;
    int getX() { return x; }
};

class Derived2 : public Base { };

int main(void)
{
    /*Derived d;
    d.fun();*/
    //Test t; //error: cannot declare variable 't' to be of abstract type 'Test'
    Base *bp = new Derived(1,2);
    bp->show();
    //Derived2 d2; //error: derived class must override virtual function

    Derived d2(4, 5);
    d2.fun();
    return 0;
}
