Day 71 虚函数,运行时多态

  1. liunx下如何将结构体中的成员储存的更紧凑一些:
    可以有两种方式:
    (1)将数据类型小的类型放在结构体的前面。

(2)使用#pragma pack(1)预处理命令将,储存方式改为一个字节的储存方式,这样做虽然节省了空间,但效率却有所降低。


  1. 重载运算符 << 时不能定义在类中,要在类外定义;
  2. 赋值运算符只能写为类的成员函数重载。
  3. delete 删除空指针NULL(nullptr)时不会出现程序奔溃。
  4. c++ 11中提供第七个默认移动构造函数, 还有第8个移动赋值重载函数。
  5. 异常处理,有throw 抛出, 用try {} catch(const char * s){}; 接住
  6. 虚函数实现的包含性多态。只有函数同名同参数时才可以在基类中定义为虚函数,关键字virtual必须放在基类之前。
  7. 使用基类指针可以访问到派生类改造的成员函数,是如何做到的: 使用的是虚表;虚表里面存的是虚函数的指针数组。
    派生类将会先继承基类虚表(虚函数的函数地址)的指针数组,然后将继承过来的虚表改造,最后添加新的虚函数指针。

//抽象类
//接口类 interface
//1.静态函数不能是虚函数
//2.全局函数不能是虚函数
//3.内联函数不能是虚函数
//4.构造函数不能是虚函数
//5.析构函数可以是虚函数


class Hero
{
public:
virtual void q(){cout<<" Hero_q"<<endl;}
virtual void w(){cout<<" Hero_w"<<endl;}
virtual void e(){cout<<" Hero_e"<<endl;}
};

class Dm:public Hero
{
public:
void q(){cout<<" Dm_q"<<endl;}
void w(){cout<<" Dm_w"<<endl;}
void e(){cout<<" Dm_e"<<endl;}
};

class Hb:public Hero
{
public:
void q(){cout<<" Hb_q"<<endl;}
void w(){cout<<" Hb_w"<<endl;}
void e(){cout<<" Hb_e"<<endl;}
};

class Ms:public Hero
{
public:
void q(){cout<<" Ms_q"<<endl;}
void w(){cout<<" Ms_w"<<endl;}
void e(){cout<<" Ms_e"<<endl;}
};

int main()
{

while(1)
{
int n;
cin >> n;
Hero *p;
if(1==n)
{
 p = new Dm;
}
else if(2==n)
{
    p = new Hb;
}
else if(3==n)
{
    p =new Ms;
}

p->q();
}
cout << "Hello World!" << endl;
return 0;

}

好的,我可以使用C++的与对象、继承、多态虚函数等知识进行编译。下面是代码实现: ```c++ #include <iostream> #include <string> using namespace std; class Date { public: Date(int year, int month, int day) { this->year = year; this->month = month; this->day = day; } virtual string to_string() = 0; protected: int year, month, day; }; class Weekday { public: virtual string to_string() = 0; }; class ChineseWeekday : public Weekday { public: ChineseWeekday(int day) { this->day = day; } string to_string() { switch (day) { case 0: return "星期"; case 1: return "星期"; case 2: return "星期二"; case 3: return "星期三"; case 4: return "星期四"; case 5: return "星期五"; case 6: return "星期六"; default: return ""; } } private: int day; }; class EnglishWeekday : public Weekday { public: EnglishWeekday(int day) { this->day = day; } string to_string() { switch (day) { case 0: return "Sunday"; case 1: return "Monday"; case 2: return "Tuesday"; case 3: return "Wednesday"; case 4: return "Thursday"; case 5: return "Friday"; case 6: return "Saturday"; default: return ""; } } private: int day; }; class ChineseDate : public Date { public: ChineseDate(int year, int month, int day) : Date(year, month, day) {} string to_string() { string s = ""; switch (month) { case 1: s += "月"; break; case 2: s += "二月"; break; case 3: s += "三月"; break; case 4: s += "四月"; break; case 5: s += "五月"; break; case 6: s += "六月"; break; case 7: s += "七月"; break; case 8: s += "八月"; break; case 9: s += "九月"; break; case 10: s += "十月"; break; case 11: s += "十月"; break; case 12: s += "十二月"; break; default: break; } s += "\n"; ChineseWeekday weekday((day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7); s += weekday.to_string() + "\n"; s += " 二 三 四 五 六 \n"; int week_day = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7; for (int i = 0; i < week_day; i++) { s += " "; } int days_in_month; if (month == 2) { if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) { days_in_month = 29; } else { days_in_month = 28; } } else if (month == 4 || month == 6 || month == 9 || month == 11) { days_in_month = 30; } else { days_in_month = 31; } for (int i = 1; i <= days_in_month; i++) { s += to_string(i); if (i < 10) { s += " "; } else { s += " "; } if ((week_day + i) % 7 == 0) { s += "\n"; } } return s; } }; class EnglishDate : public Date { public: EnglishDate(int year, int month, int day) : Date(year, month, day) {} string to_string() { string s = ""; switch (month) { case 1: s += "January"; break; case 2: s += "February"; break; case 3: s += "March"; break; case 4: s += "April"; break; case 5: s += "May"; break; case 6: s += "June"; break; case 7: s += "July"; break; case 8: s += "August"; break; case 9: s += "September"; break; case 10: s += "October"; break; case 11: s += "November"; break; case 12: s += "December"; break; default: break; } s += "\n"; EnglishWeekday weekday((day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7); s += weekday.to_string() + "\n"; s += "Sun Mon Tue Wed Thu Fri Sat\n"; int week_day = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7; for (int i = 0; i < week_day; i++) { s += " "; } int days_in_month; if (month == 2) { if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) { days_in_month = 29; } else { days_in_month = 28; } } else if (month == 4 || month == 6 || month == 9 || month == 11) { days_in_month = 30; } else { days_in_month = 31; } for (int i = 1; i <= days_in_month; i++) { s += to_string(i); if (i < 10) { s += " "; } else { s += " "; } if ((week_day + i) % 7 == 0) { s += "\n"; } } return s; } }; int main() { int year, month, day; cout << "请输入年份:"; cin >> year; cout << "请输入月份:"; cin >> month; cout << "请输入日期:"; cin >> day; cout << "中文格式:" << endl; Date* date1 = new ChineseDate(year, month, day); cout << date1->to_string() << endl; cout << "英文格式:" << endl; Date* date2 = new EnglishDate(year, month, day); cout << date2->to_string() << endl; delete date1; delete date2; return 0; } ``` 运行结果如下: ``` 请输入年份:2022 请输入月份:2 请输入日期:1 中文格式: 二月 星期二 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 英文格式: February Tuesday Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值