• 派生类到基类转换的可访问性和虚函数所占用的sizeof空间


      先看一段代码:

    代码
    #include <iostream>
    using namespace std;

    class Base{
    public:
        
    virtual void fun()
        {cout 
    << "Base" << endl;}
        
        
    int geti()
        {
    return i;}
        
        
    void seti(int val)
        {i 
    = val;}
    protected:
        
    int j;
    private:
        
    int i;
    };

    class Son : private Base{
    public:
        
    int use_base()
        {
    return j;}
    private:
        
    void fun()
        {cout 
    << "son1" << endl;}
        
    int val;
    };

    class Test{
        
    virtual void fun()
        {cout 
    << "Base" << endl;}
    };

    void myfun(Base& obj)
    {
        obj.fun();
    }

    void main()
    {
        Son s;
        Base b;   
        cout 
    << "sizeof(Base) " << sizeof(Base) << endl;
        cout 
    << "sizeof(Son) " << sizeof(Son) << endl;
        cout 
    << "sizeof(Test) " << sizeof(Test) << endl;
        myfun(s);   
    //错误提示:error C2243: “类型转换”: 从“Son *”到“Base &”的转换存在,但无法访问
         myfun(b);
        system(
    "pause");
    }

      关于错误提示,s因为是private继承类的对象,继承来的成员函数fun()变为自己的private成员函数,因此,在myfun()中,代码不能直接访问已经成为private的成员函数fun()。

      关于虚函数的占用空间,在32位机器上,一个虚函数占用4B空间。

      如果去掉具有错误提示的行,则运行结果为:

      

  • 相关阅读:
    redis整合spring(三)注解的方式缓存
    redis整合spring (二)
    redis整合spring (一)
    Redis面试
    JVM(六)JVM调优
    JVM故障(二)GC导致cpu飙高
    JVM故障(一)CPU跑满定位
    JVM 故障调优
    洛谷-P2141 珠心算测验
    洛谷-P1205 [USACO1.2]方块转换 Transformations
  • 原文地址:https://www.cnblogs.com/younes/p/1621098.html
Copyright © 2020-2023  润新知