I have 2 programs. Why EX1 is correct but EX 2 is not?

======EX 1=======
Code:
class Base{
public:
void foo() const{ }

};


class Derived: public Base{
public:
int foo() const{ return 1; }
};
======EX 2======

Code:
class Base{
public:
virtual void foo() const{ }

};


class Derived: public Base{
public:
int foo() const{ return 1; }
};