```c++
#include <iostream>
#include <string>
using namespace std;
class DateV1 {
public:
int year, month, day;
DateV1() {
year = 2021;
month = 10;
day = 1;
}
DateV1(int y, int m, int d) {
year = y;
month = m;
day = d;
}
};
class DateV2 : public DateV1 {
public:
DateV2() : DateV1() {}
DateV2(int y, int m, int d) : DateV1(y, m, d) {}
string getWeekDay() {
string weekdays[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int days = countDays();
return weekdays[days % 7];
}
bool Leap() {
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
return true;
return false;
}
int differFrom(DateV2& oneDate) {
int days = countDays() - oneDate.countDays();
return days < 0 ? -days : days;
}
void printDate() {
string months[] = {"January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"};
cout << year << "-" << months[month - 1] << "-" << day << endl;
}
private:
int countDays() {
int days = 0;
for (int i = 1; i < year; i++) {
if (Leap()) days += 366;
else days += 365;
}
int monthDays[] = {31,28,31,30,31,30,31,31,30,31,30,31};
if (Leap()) monthDays[1] = 29;
for (int i = 1; i < month; i++) {
days += monthDays[i - 1];
}
days += day - 1;
return days;
}
};
int main() {
DateV2 today(2021, 10, 1);
DateV2 tomorrow(2021, 10, 2);
DateV2 myBirthday(2000, 10, 1);
cout << "Today's date: ";
today.printDate();
cout << "Tomorrow's date: ";
tomorrow.printDate();
cout << "My birthday: ";
myBirthday.printDate();
cout << endl << "Weekday of today: " << today.getWeekDay() << endl;
cout << "Weekday of tomorrow: " << tomorrow.getWeekDay() << endl;
cout << "Weekday of my birthday: " << myBirthday.getWeekDay() << endl;
cout << endl << "Days since my birthday: " << today.differFrom(myBirthday) << endl;
return 0;
}
```