一道经典题目---虚函数继承和虚继承
2009-08-28 13:45
260 查看
#include <cstdlib>
2#include <iostream>
3#include <memory>
4
5using namespace std;
6class A
7
13class B : public virtual A
14
20class C : public virtual B
21
27int main(int argc, char *argv[])
28{
29 cout<<"sizeof(A):"<<sizeof(A)<<endl;
30 cout<<"sizeof(B):"<<sizeof(B)<<endl;
31 cout<<"sizeof(C):"<<sizeof(C)<<endl;
32 system("PAUSE");
33 return EXIT_SUCCESS;
34}问题:程序运行的结果?
答案:8,16,24。
解释:
(1)对于类A,由于有一个虚函数,那么必须得有一个对应的虚函数表来记录对应的函数入口地址。每个地址需要一个虚指针,指针的大小为4。类中还有一个char k[3],当然大小为3。为什么是8呢?因为在计算机里,是以4为单位,所以第一条输出的结果为8。
(2)对于类B,同类A一样,自己的大小为8,但是由于虚继承类A,所以在虚表中要加入一个虚类指针来指向其类A,然后在包含类A的所有成员,sizeof(A)为8,结果便是16。
(3)对于类C,同类B一样,自己的大小8,加上sizeof(B),结果为24。
虚继承就是为了节约内存的,他是多重继承中的特有的概念。适用与菱形继承形式。
虚函数继承就是覆盖。即基类中的虚函数被派生类中的同名函数所覆盖。 是实现多态的方法。
2#include <iostream>
3#include <memory>
4
5using namespace std;
6class A
7
13class B : public virtual A
14
20class C : public virtual B
21
27int main(int argc, char *argv[])
28{
29 cout<<"sizeof(A):"<<sizeof(A)<<endl;
30 cout<<"sizeof(B):"<<sizeof(B)<<endl;
31 cout<<"sizeof(C):"<<sizeof(C)<<endl;
32 system("PAUSE");
33 return EXIT_SUCCESS;
34}问题:程序运行的结果?
答案:8,16,24。
解释:
(1)对于类A,由于有一个虚函数,那么必须得有一个对应的虚函数表来记录对应的函数入口地址。每个地址需要一个虚指针,指针的大小为4。类中还有一个char k[3],当然大小为3。为什么是8呢?因为在计算机里,是以4为单位,所以第一条输出的结果为8。
(2)对于类B,同类A一样,自己的大小为8,但是由于虚继承类A,所以在虚表中要加入一个虚类指针来指向其类A,然后在包含类A的所有成员,sizeof(A)为8,结果便是16。
(3)对于类C,同类B一样,自己的大小8,加上sizeof(B),结果为24。
虚继承就是为了节约内存的,他是多重继承中的特有的概念。适用与菱形继承形式。
虚函数继承就是覆盖。即基类中的虚函数被派生类中的同名函数所覆盖。 是实现多态的方法。
相关文章推荐
- 一道关于public,private,protected继承的经典题目
- 一道面试题目【构造一个函数f(n)使得f(f(n))=-n】
- 一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) [c#]
- 一道关于C++ 的面试题目(继承、构造函数以及析构函数)
- 2015 百度笔试的一道经典题目
- 一道经典的面向对象题目的JAVA实现
- 你感觉你是个JAVA高手吗,那么就来挑战一下吧,下面可是ACM一道很经典的题目,试一吧!
- 一道简单的但是经典的动态规划题目
- c++经典题目:写个函数,将其中的\t都转换成4个空格
- 一道经典的面试题目(寻找1-1000中重复的数字)
- 一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) [c#]
- 一道关于继承和多态的题目
- 一道超经典的C++结构体的题目
- 关于继承的一道题目
- java 面试中的一道截取字符串的经典题目
- 经典面试题目--在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 关于java继承的一道经典面试题
- js的一道经典题目
- 一道Amazon经典的题目,经常会考到,给一个target数字以及一个数组,求所有的加起来为这个数字的组合
- C/C++一道题目的答案-函数指针与指针函数