代码之家  ›  专栏  ›  技术社区  ›  Naghi

为什么派生类成员函数在指针视图[c++]中隐藏?

  •  0
  • Naghi  · 技术社区  · 4 年前

    这是一个基类和两个派生类的实现:

    #include <iostream>
    
    using namespace std;
    
    class myClass
    {
        public:
        int f();
    };
    
    int myClass::f()
    { return 0;}
    
    class mySubClass1
    :public myClass
    {
        public:
        int f();
    };
    
    int mySubClass1::f()
    {return 1;}
    
    class mySubClass2
    :public myClass
    {
        public:
        int f();
    };
    
    int mySubClass2::f()
    {return 2;}
    
    int main()
    {
        myClass myClassObj;
        mySubClass1 mySubClass1Obj;
        mySubClass2 mySubClass2Obj;
    
        myClass* myClassPtr;
        myClassPtr = &myClassObj;
        cout << myClassPtr->f() << endl;
        myClassPtr = &mySubClass1Obj;
        cout << myClassPtr->f() << endl;
        myClassPtr = &mySubClass2Obj;
        cout << myClassPtr->f() << endl;
    
        return 0;
    }
    
    

    输出为:

    0
    0
    0
    

    虽然我期待

    0
    1
    2
    

    我知道这个问题可以用 virtual 功能;但我想知道 提问 : 上述意外结果与三个对象的内存分配有何关系?从内存的角度来看,为什么它不返回预期的结果?

    0 回复  |  直到 4 年前
        1
  •  2
  •   SergeyA    4 年前

    在与指针的静态类型对应的类中搜索函数声明。

    因此,基类中声明的函数的调用与指针的动态类型无关。

    您需要声明一个虚拟函数来提供动态类型。

    例如

    class myClass
    {
        public:
        virtual int f();
    };
    
    //...
    
    class mySubClass1
    :public myClass
    {
        public:
        int f() override;
    };
    
    //...
    
        2
  •  0
  •   MorningDewd    4 年前

    C++中对象的大小不取决于类中成员函数的数量。成员函数不是“存储”在对象实例中,而是放在最终二进制文件中的某个地方,可以从任何对象访问它们。

    如果调用类的成员函数,编译器/链接器将引用该函数执行。

    那么,如果有虚函数,对象如何知道要调用哪个函数呢?

    具有虚函数的类的对象还具有一些隐藏的元数据(称为vtable,不同编译器的布局方式不同),这些元数据保存了指向调用虚函数时应调用的函数的指针。

    这是对象知道要调用哪个虚函数(如果有的话)的机制。

    从没有虚函数的类和有虚函数的类时的类大小差异可以看出这种隐藏元数据的演示:

    class foo {
        void bar();
    };
    
    class vfoo {
        virtual void vbar();
    };
    
    sizeof(foo);    // returns 1
    sizeof(vfoo);   // returns 8
    

    1字节是因为对象不能没有大小,8字节对象基本上由指向vtable的指针组成。