C++ 虚函数 虚函数继承 虚继承

虚函数:用来解决动态多态的问题的,虚函数就是在基类中声明函数是虚拟的,并不是实际存在的函数,然后在派生类中才正式定义此函数;

虚函数作用:允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。

虚函数继承和虚继承是完全不同的两个概念。

虚函数继承是解决多态性的,当用基类指针指向派生类对象的时候,基类指针调用虚函数的时候会自动调用派生类的虚函数,这就是多态性,也叫动态编联。

虚继承就是为了节约内存,他是多重继承中的特有的概念。适用于菱形继承形式。

比如B继承于A、C继承于A、D继承于B和C,显然D会继承两次A(图1)。因此,为了节省空间,可以将B、C对A的继承定义为虚拟继承,而A就成了虚拟基类(图2)。代码如下:

 A    A           A 
  \    /           / \ 
  B   C           B  C 
   \  /            \  / 
   D             D 

  (图1)          (图2)

class A;
class B :public virtual A;
class C: public virtual B;
class D: public B,public C;

虚继承的时候子类会有一个指向自己虚函数表的指针,同时也会加入一个指向父类的虚类指针,然后还要包含父类的所有内容。

虚继承时如果子类父类都有虚函数,那么它会重新建立一张虚表,不包含父类虚表的内容;而在普通的继承中却是在父类虚表的基础上建立一张虚表。这就意味着如果虚继承中子类父类都有各自的虚函数,在子类里面就会有两个虚函数表指针,一个指向父类的虚表,一个指向子类的虚表,而普通的继承只有一个指向子类虚表的指针。代码说明:

#include<iostream>
#include<memory.h>
#include<assert.h>
using namespace std;
class A
{
	char  k[3];
public:
	virtual void aa(){};
};

class B :public virtual A
{
	char j[3];
public:
	virtual void bb(){};
};

class C :public virtual B
{
	char i[3];
public:
	virtual void cc(){};
};

int main()
{
	A a1;
	B b1;
	C c1;
	cout << sizeof(A) << endl;
	cout << sizeof(B) << endl;
	cout << sizeof(C) << endl;
	system("pause");
	return 0;
}

输出结果为:8、20、32。

分析:类A中包含一个整型变量k(4字节),一个虚表指针(4字节),所以一共8字节。类B中,一个整型变量j(4字节),一个虚表指针(4字节),因为B虚继承于A,所有会有一个指向类A的虚类指针(4字节),同时还要包含类A中的整型变量k(4字节)以及类A的虚表指针(4字节),所以一共20字节。类C同理。

如果将上述代码改为普通继承,那么输出结果为:8、12、16。没有虚类指针,也不会有多个虚表指针。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值