- liunx下如何将结构体中的成员储存的更紧凑一些:
可以有两种方式:
(1)将数据类型小的类型放在结构体的前面。
(2)使用#pragma pack(1)预处理命令将,储存方式改为一个字节的储存方式,这样做虽然节省了空间,但效率却有所降低。
- 重载运算符 << 时不能定义在类中,要在类外定义;
- 赋值运算符只能写为类的成员函数重载。
- delete 删除空指针NULL(nullptr)时不会出现程序奔溃。
- c++ 11中提供第七个默认移动构造函数, 还有第8个移动赋值重载函数。
- 异常处理,有throw 抛出, 用try {} catch(const char * s){}; 接住
- 虚函数实现的包含性多态。只有函数同名同参数时才可以在基类中定义为虚函数,关键字virtual必须放在基类之前。
- 使用基类指针可以访问到派生类改造的成员函数,是如何做到的: 使用的是虚表;虚表里面存的是虚函数的指针数组。
派生类将会先继承基类虚表(虚函数的函数地址)的指针数组,然后将继承过来的虚表改造,最后添加新的虚函数指针。
//抽象类
//接口类 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;
}