个人理解:
多态就是不同场景下一个类所表达出的不同状态,其分类为静态多态和动态多态,
1.静态多态:我们所知道的函数重载便是,这种静态多态是在编译期间就完成的,编译期间编译器根据情况选择调用合适的函数完成函数重载。要是没有合适的就报错。
2.动态多态:我们用的非常多的一种多态,动态多态我就不能不讲一个关键字。
Virtual:在类的成员函数声明前加上virtual,则这个成员函数叫虚函数,这时,类会在类内最上面加上一个隐藏的指针,指针指向一个表,这个表内就是所有虚函数的地址。
定义先讲到这,我们回到多态,多态的两个必要条件:
1)基类中必须包含虚函数。
2)并且派生类中一定要对基类中的虚函数进行重写。
这我个人的理解是:(虚函数表中的虚函数地址可以用来重写,当对象要重写父类对象中的虚函数时,便将子类函数的指针放入虚函数表中对应的位置。这样完成了对父类虚函数的重写)。那这时我们需要注意什么函数可以做虚函数。
虚函数的定义要遵循以下重要规则:
1.如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,那么即使加上了virtual关键字,也是不会进行滞后联编的。
2.只有类的成员函数才能说明为虚函数,因为虚函数仅适合用与有继承关系的类对象,所以普通函数不能说明为虚函数。
3.静态成员函数不能是虚函数,因为静态成员函数的特点是不受限制于某个对象。
4.内联(inline)函数不能是虚函数,因为内联函数不能在运行中动态确定位置。即使虚函数在类的内部定义定义,但是在编译的时候系统仍然将它看做是非内联的。
5.构造函数不能是虚函数,因为构造的时候,对象还是一片位定型的空间,只有构造完成后,对象才是具体类的实例。
6.析构函数可以是虚函数,而且通常声名为虚函数。
抽象类:
在虚函数声明后面加=0;如下:
virtual void Person(TakeBus& tb) = 0;
这时,这个函数就叫纯虚函数(=0就变成纯的了!!!),如果一个类中有纯虚函数,那么这个类就交抽象类(孩子变纯,爸爸变抽象。。。)。纯虚函数是没有具体实现的,完全需要其派生类中对其继承进行具体实现(重写),否则纯虚函数则一点用没有。
类的大小:
1.空类:空类即什么都没有的类,按上面的说法,照理说大小应该是0,但是,空类的大小为1,因为空类可以实例化,实例化必然在内存中占有一个位置,因此,编译器为其优化为一个字节大小。
2.一般类的大小(没有虚函数啥的):成员变量的大小,此时空表的1就消失了。但是需要注意内存对其。比如:
class A
{
char a;
int b;
double c;
}
为16个字节。而:
class A
{
double c;
int b;
char a;
}为24字节。需要注意