3.29 c提高 6day 继承

发布时间 2023-03-29 22:48:15作者: 逆向狗

1.继承中的构造和析构
--执行顺序--
父类构造
子类构造
析构子类
析构父类

2.继承中同名成员的处理
1.当子类和父类有同名成员时,子类的同名成员会隐藏父类的同名成员
class fa
{
public:

int c = 0x11;

private:

};
class son :public fa
{
public:
int c = 0x8;
};
int main()
{
son w;
printf("%x", w.c);
printf("%x", w.fa::c);

}

0x005FFA90 00000011 00000008 对象空间内还是存储这值
1.当子类和父类有同名成员时,子类的同名函数会隐藏父类的同名函数

3.继承中静态成员特性
1.静态成员可以被继承
2.继承中的静态成员变量一样会被同名的子类成员变量隐藏
3.继承中的静态成员函数中,子类和父类有同名静态函数时,父类的所以重载函数被隐藏
4.改变从基类继承过来的静态函数的某个特征,返回值或者参数
5.静态成员函数不能是虚函数

6.菱形继承

虚继承解决菱形继承问题

a
b c -继承 a
d--继承 b c
产生二义性问题
父类虚继承祖类,用virtual关键字
静态联编

早绑定
ff 汇编
1.编译阶段确定了函数地址
动态联编

晚绑定
e8 汇编
也就是 用virtual关键字 使函数成为虚函数

多态
1.同一个函数 因为对象不同执行不同的代码

include

using namespace std;
class a
{
public:
int c = 0;
void virtual testa()
{
printf("a");
}
private:

};
class b :public a
{
public:

void   testa()
{
	printf("b");
}

private:

};
class c :public a
{
public:

void  testa()
{
	printf("c");
}

private:

};
void doa(a* pp)
{
pp->testa();
}
void test()
{
a* gg = NULL;
gg = new b;
gg->testa();

gg = new c;
doa(gg);

}
int main()
{
test();
//printf("%d", son::c);

}

虚函数表

virtual 函数过大生成的一张表

子类 转换父类 向上造型 安全
父类 转 子类 向下 不安全