C++对象筹划及多态之虚成员函数调用[VC/C++编程]
本文“C++对象筹划及多态之虚成员函数调用[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在构造函数中调用虚成员函数,固然这是个不很常用的技术,但研究一下可以加深对虚函数机制及对象构造历程的理解.这个问题也和普通直观上的熟习有所差别.先看看下面的两个类定义.
struct C180
{
C180() {
foo();
this->foo();
}
virtual foo() {
cout << "<< C180.foo this: " << this << " vtadr: " << *(void**)this << endl;
}
};
struct C190 : public C180
{
C190() {}
virtual foo() {
cout << "<< C190.foo this: " << this << " vtadr: " << *(void**)this << endl;
}
};
父类中有一个虚函数,并且父类在它的构造函数中调用了这个虚函数,调用时它采取了两种办法一种是直接调用,一种是通过this指针调用.同时子类又重写了这个虚函数.
我们可以来猜测一下假如构造一个C190的对象会发生什么情形.
我们知道,在构造一个对象时,首先会按对象的大小得到一块内存(在heap上或在stack上),然后会把指向这块内存的指针做为this指针来调用类的构造函数,对这块内存举行初始化.假如对象有父类就会先调用父类的构造函数(并顺次递归),假若有多个父类(多重担当)会顺次对父类的构造函数举行调用,并会得当的调整this指针的位置.在调用完好部的父类的构造函数后,再履行自己的代码.
照上面的解析构造C190时也会调用C180的构造函数,这时在C180构造函数中的第一个foo调用为静态绑定,会调用到C180::foo()函数.第二个foo调用是通过指针调用的,这时多态行为会发生,应当调用的是C190::foo()函数.
履行以下代码:
C190 obj;
obj.foo();
后果为:
<< C180.foo this: 0012F7A4 vtadr: 0045C404
<< C180.foo this: 0012F7A4 vtadr: 0045C404
<< C190.foo this: 0012F7A4 vtadr: 0045C400
以上是“C++对象筹划及多态之虚成员函数调用[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |