微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么派生类成员函数从指针视图中隐藏[c ++]?

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

#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函数解决;但我想知道问题: 上面的意外结果如何与对三个对象的内存分配有关?为什么从内存的角度来看它不返回预期的结果?

解决方法

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

结果是,基类中声明的函数被调用,而与指针的动态类型无关。

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

例如

class myClass
{
    public:
    virtual int f();
};

//...

class mySubClass1
:public myClass
{
    public:
    int f() override;
};

//...
,

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

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

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

具有虚函数的类的对象还具有一些隐藏的元数据(称为vtable-这种布局的方式在不同的编译器之间是不同的),除其他外,这些元数据保存指向在调用a时应调用的函数的指针。虚拟功能。

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

从没有虚拟功能的类到具有虚拟功能的类之间的类大小差异,可以看到这种隐藏的元数据的演示:

class foo {
    void bar();
};

class vfoo {
    virtual void vbar();
};

sizeof(foo);    // returns 1
sizeof(vfoo);   // returns 8

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。