C++的基本语法:虚拟继承
虚拟继承的概念提出的主要解决的问题是C++的多重继承,这是最简单的例子:复制代码代码如下所示:
类动物{
公共:
无效OP()
{ cout 喂动物;}
};
老虎类:公共动物{
公共:
无效TG()
{ cout 这是老虎;}
};
狮子类:公共动物{
公共:
空LO()
{ cout 这是狮子;}
};
类狮虎:公共的老虎,狮子{公共
公共:
空LO()
{ cout 这是狮子;}
};
主()
{
类狮虎oneliger;
Liger.op ();
}
以上liger.op();错误将被报告,和模糊变量提示由于老虎和狮子包含OP()父类的动物手术。
在这个时候,记忆中的oneliger对象布局是低到高以下。
1的成员变量,动物
2。继承老虎的成员变量
(包括OP)
三.继承狮子的成员变量
也包括OP()
4、狮虎本身的成员变量
PS的布局:如果有一个虚函数是一个虚表对象在内存中是第一位的,虚表指针指向一个函数指针数组,然后是一个成员变量,如果第一个是最常见的遗传性根父类的成员变量,然后一个父类成员变量,这是最后一次{ }的成员变量而不是虚拟继承,成员函数被编译成全局函数是不存储在对象空间,当调用成员函数来找到相应的函数,通过类,那么这个指针传递给函数:
例如,像这样的代码
测试函数;
test.print();
编译器将转换成:(伪代码)
测试函数;
ctest_print(测试); / /打印函数功能:ctest_print(C * const转换为本);
所以这与普通函数调用没有一点不同。
现实应该是找到物体的功能,也就是说,根据这个指针。
为了解决多重继承的问题,所以C++提出虚拟继承的概念,虚拟继承是在子类中只保留一个副本的父类,与上述的子类,是,如果你有一个副本的父类的一份什么父母类,如果不加一份:
复制代码代码如下所示:
类动物{
公共:
无效OP()
{ cout 喂动物;}
};
类虎:公共虚拟动物{
公共:
无效TG()
{ cout 这是老虎;}
};
班级狮子:公共虚拟动物{
公共:
空LO()
{ cout 这是狮子;}
};
类狮虎:公共的老虎,狮子{公共
公共:
空LO()
{ cout 这是狮子;}
};
主()
{
类狮虎oneliger;
Liger.op();
}
在这一点上,在内存中的对象的布局成为狮虎:
4的成员变量,动物
三.继承老虎的成员变量
(包括OP)
2。继承狮子的成员变量
已经包含一个副本,所以没有(包括OP)
1、狮虎本身的成员变量
这样,记忆中的动物对象只有一个副本,所以没有模糊问题。