非静态的成员函数存储及其调用方式

来源:百度知道 编辑:UC知道 时间:2024/05/28 05:57:20
非静态的成员函数存储在哪里?
我的意思是,在程序加载的时候,类的非静态成员函数会放在内存的哪个位置?
请不要简单的回答是在堆,或者栈上(虽然我认为绝大多数可能会放到堆上)。请说明理由,谢谢。(此问20分)
还有一个问题就是,类如何调用这样的函数,若是通过指针调用,那么指针保存在哪里。请详细说明。谢谢。(此问30分)
若有满意回答则再奖励50分。

这是“C++对象模型”的内容。
非成员函数,与普通的C全局函数一样,存放在代码段里(汇编层次)
Class A
{
public:
int fun(){};
}
main()
{
A thea;
thea.fun();
}
自己跟踪一下汇编代码现,调用成员函数时,多push了一个参数,这就是this指针。

希望对您有些帮助。

考虑下面两个类:
class Base {public: virtual void f();};
class Derived : Base {public: void f();};

在C++中,类的指针或引用有两种类型:静态类型和动态类型。
Base *b; b = new Derived();
对于b,它的静态类型是左边的Base,动态类型是右边的Derived。如果我这样调用:
b->f();那么这就是一个多态调用,因为f()函数是virtual的。虽然我声明的b是Base类型,但实际上,这个f()调用的是Derived类中的f()函数。
可以简单地这样说,在C++中,如果用一个类的指针或者引用调用函数,且这个函数是virtual的,那么这个调用就是多态的,意思就是,它会调用那个指针或者引用的动态类型(也就是实际类型)的相应的函数。否则的话,这个调用便是非多态的,也就是它只会调用这个对象的静态类型的相应的函数。

上面我已经说了啊。注意最后一句话,也就是说,除了“类对象指针->虚方法”和“类对象引用.虚方法”外,其他的都是非多态调用。如:
Base b;
b.f();
这肯定是调用的基类中的f();
如果把上面例子中,virtual去掉,那么:
Base *b = new Derived;
b->f();
也是调用的基类中的f(),而不是它实际类型Derived类中的f()。

上面这位好像没看楼主问的是什么就COPY过来哟~~~