sizeof and virtual

sizeof and virtual

sizeof

  • 空类的大小为1字节
  • 一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间。
  • 对于包含虚函数的类,不管有多少个虚函数,只有一个虚指针。
  • 普通继承,派生类继承了所有基类的函数与成员,要按照字节对齐来计算大小
  • 虚函数继承,不管是单继承还是多继承,都是继承了基类的vptr。(32位操作系统4字节,64位操作系统 8字节)!
  • 虚继承,继承基类的vptr。

virtual

纯虚函数,通过定义的时候赋值0来声明,包含纯虚函数的类为抽象类,抽象类不能创建对象但可以定义抽象类的指针。虚函数的调用取决于指向或者引用的对象的类型,而不是指针或者引用自身的类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 抽象类至少包含一个纯虚函数
class Base{
public:
virtual void show() = 0; // 纯虚函数
int getX() { return x; } // 普通成员函数

private:
int x;
};

class Derived : public Base {
public:
void show() { cout << "In Derived \n"; } // 实现抽象类的纯虚函数
Derived(){} // 构造函数
};

int main(void)
{
//Base b; // error! 不能创建抽象类的对象
//Base *b = new Base(); error!

Base *bp = new Derived(); // 抽象类的指针和引用 -> 由抽象类派生出来的类的对象
bp->show();
return 0;
}

抽象类可以有构造函数

构造函数不能是虚函数,而析构函数可以是虚析构函数

静态函数不可以声明为虚函数,同时也不能被const 和 volatile关键字修饰,static成员函数不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义

  • Copyrights © 2018-2022 Haojia Zhu
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信