C++多态及类的大小

个人理解:

多态就是不同场景下一个类所表达出的不同状态,其分类为静态多态和动态多态,

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字节。需要注意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值