如何解决为什么派生类成员函数从指针视图中隐藏[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 举报,一经查实,本站将立刻删除。