Implement a C++ class representing a simple stack data structure with methods for push, pop, top, and checking if the stack is empty. Additionally, write a main function that demonstrates the usage of this stack class by performing a series of operations and printing the results.

```cpp
#include <iostream>
#include <vector>

class Stack {
public:
    // Push an element onto the stack
    void push(int value) {
        data.push_back(value);
    }

    // Pop an element off the stack
    int pop() {
        if (isEmpty()) {
            std::cerr << "Error: Stack is empty!" << std::endl;
            return -1;
        }
        int topValue = data.back();
        data.pop_back();
        return topValue;
    }

    // Get the top element of the stack
    int top() const {
        if (isEmpty()) {
            std::cerr << "Error: Stack is empty!" << std::endl;
            return -1;
        }
        return data.back();
    }

    // Check if the stack is empty
    bool isEmpty() const {
        return data.empty();
    }

private:
    std::vector<int> data;
};

int main() {
    Stack myStack;

    // Perform a series of operations on the stack and print the results
    myStack.push(10);
    myStack.push(20);
    myStack.push(30);

    std::cout << "Top element: " << myStack.top() << std::endl; // Output: 30

    myStack.pop();

    std::cout << "Top element after pop: " << myStack.top() << std::endl; // Output: 20

    std::cout << "Is the stack empty? " << (myStack.isEmpty() ? "Yes" : "No") << std::endl; // Output: No

    myStack.pop();
    myStack.pop();

    std::cout << "Is the stack empty after popping all elements? " << (myStack.isEmpty() ? "Yes" : "No") << std::endl; // Output: Yes

    return 0;
}
```