8. 派生类的构造函数和析构函数
基类的构造函数和析构函数不能被派生类继承,会被自动调用
构造派生类时执行的顺序依次是:基类构造函数的参数化列表->基类构造函数的函数体->派生类构造函数参数化列表->派生类构造函数函数体
析构派生类时执行的顺序依次是:派生类的析构函数->派生类中对象的析构函数->基类的析构函数->基类中对象的析构函数
class D
{
public:
D()
{
std::cout<<"构造函数D"<<std::endl;
}
~D()
{
std::cout<<"析构函数D"<<std::endl;
}
};
class A
{
private:
D d;
public:
A()
{
std::cout<<"构造函数A"<<std::endl;
}
~A()
{
std::cout<<"析构函数A"<<std::endl;
}
};
class B
{
public:
B()
{
std::cout<<"构造函数B"<<std::endl;
}
~B()
{
std::cout<<"析构函数B"<<std::endl;
}
};
class C : public A
{
private:
B b;
public:
C():b()
{
std::cout<<"构造函数C"<<std::endl;
}
~C()
{
std::cout<<"析构函数C"<<std::endl;
}
};
9. 重载,覆盖和隐藏
重载
* 在同一个类中
* 函数名相同
* 参数不同,包括类型和个数
* 返回值也可不同
* virtual关键字可有可无
class E
{
public:
virtual int fun();
void fun(int a);
void fun(int a, int b);
void fun(float a);
};
覆盖
* 派生类中的成员函数覆盖基类中的同名函数
* 基类函数必须是虚函数
* 函数的参数类型和个数必须相同
* 函数名必须相同
class E
{
public:
virtual int fun();
virtual bool fun1(int a);
};
class F : public E
{
public:
int fun();
};
class G : public F
{
public:
bool fun1(int a);
};
隐藏
派生类中的同名函数屏蔽了基类中的函数,若基类函数为虚函数,派生类中同名函数参数和返回值都相同,则是覆盖,若有不同,则是隐藏 ,若基类函数不是虚函数,则派生类中的同名函数肯定会把基类中的同名函数隐藏掉
扫描二维码关注公众号,回复:
12552811 查看本文章
class E
{
public:
virtual int fun();
virtual bool fun1(int a);
float fun2(bool b);
};
class F : public E
{
public:
int fun(int a);
float fun2(int b);
};
class G : public F
{
public:
int fun1(bool b);
};
10. 虚函数
* 动态联编的基础
* virtual 修饰的函数
* 对多态性的支持
* virtual修饰的函数被重写,该函数就具有多态性
* 多态其实就是父类指针指向具体的子类对象
* 本质是由虚函数表和虚函数指针来实现的
11. 结构体和共用体
* 结构体的大小是其最大成员字节数的整数倍
* 分配各成员字节数时,会根据相邻成员字节数响应填充部分空间
* 按成员的顺序分配内存
* 共用体的大小等于其最大成员所占的字节数
* 共用体每次只能存储一个成员的值
struct aa
{
short a;//4
int b;//4
char c;//4
};
struct aa
{
char c;//2
short a;//2
int b;//4
};
union AAA
{
int a;
double b;
char c;
};
union AAA a;
a.a = 8;
a.b = 12.0;
printf("%d,%f, %d", a.a,a.b,sizeof(a));
12.0 内存管理
自动存储
栈存储,如函数的形参,函数内部声明的变量及结构体变量
静态存储
编译器预分配
extern声明的变量为全局变量,可定义性 声明extern int a = 10
引用性声明
动态存储
new/delete