深入C++对象模型&虚函数表-创新互联
多态的实现机制:
旌阳ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!C++中虚函数的主要作用就是用来实现多态,就是使用基类的指针或者引用调用重写的虚函数,当父类的指针或引用指向父类对象时调用的是父类虚函数,当指向子类对象时调用的是子类的虚函数。那么这又是怎么实现的呢???
这都是通过虚函数表实现的,虚函数表是通过一块连续内存来存储虚函数的地址。这张表解决了虚函数重写(地址进行覆盖)的问题 。在有虚函数的对象实例中都有一张虚函数表,虚函数表就像一张地图,指明了实际调用的虚函数函数。
例:
class Base
{
public:
Base()
:_b(1){}
virtual void fun1()
{ }
virtual void fun2()
{ }
private:
int _b;
};虚函数表的最后一个元素是一个空指针。
既然我们知道了虚函数的地址,那么就可以通过过找到这块地址来调用这个虚函数。这也导致了多态的不安全性,效率降低。
typedef void (* pfun)();
void PrintfBase(pfun *_ppfun)
{
int i = 0;
for (i = 0; _ppfun[i] != NULL; i++)
{
_ppfun[i] ();
}
}
void test()
{
Base b;
PrintfBase((pfun *)*((int *)(&b)));
}1、单继承对象模型
class Base
{
public:
Base()
:_b(1){}
virtual void fun1()
{
cout << "Base::fun1()" <


2、多重继承的对象模型
class Base1
{
public:
Base1()
:_b1(1){}
virtual void fun1()
{
cout << "Base1::fun1()" <


3、菱形继承的对象模型
class Base
{
public:
Base()
:_b1(1){}
virtual void fun1()
{
cout << "Base1::fun1()" << endl;
}
virtual void fun2()
{
cout << "Base1::fun2()" << endl;
}
private:
int _b1;
};
class Base2:public Base
{
public:
Base2()
:_b2(1){}
virtual void fun1()
{
cout << "Base2::fun1()" << endl;
}
virtual void fun3()
{
cout << "Base2::fun2()" << endl;
}
private:
int _b2;
};
class Base3:public Base
{
public:
Base3()
:_b3(1){}
virtual void fun1()
{
cout << "Base3::fun1()" << endl;
}
virtual void fun3()
{
cout << "Base3::fun2()" << endl;
}
private:
int _b3;
};
class Deriver:public Base2,public Base3
{
public:
Deriver()
:_d3(3){}
virtual void fun1()
{
cout << "Deriver::fun1()" << endl;
}
virtual void fun4()
{
cout << "Deriver::fun3()" << endl;
}
private:
int _d3;
};


4、菱形的虚拟继承
class Base
{
public:
Base()
:_b1(1){}
virtual void fun1()
{
cout << "Base1::fun1()" << endl;
}
virtual void fun2()
{
cout << "Base1::fun2()" << endl;
}
private:
int _b1;
};
class Base2:virtual public Base
{
public:
Base2()
:_b2(2){}
virtual void fun1()
{
cout << "Base2::fun1()" << endl;
}
virtual void fun3()
{
cout << "Base2::fun2()" << endl;
}
private:
int _b2;
};
class Base3:virtual public Base
{
public:
Base3()
:_b4(3){}
virtual void fun1()
{
cout << "Base3::fun1()" << endl;
}
virtual void fun3()
{
cout << "Base3::fun2()" << endl;
}
private:
int _b3;
};
class Deriver:public Base2,public Base3
{
public:
Deriver()
:_d3(4){}
virtual void fun1()
{
cout << "Deriver::fun1()" << endl;
}
virtual void fun4()
{
cout << "Deriver::fun4()" << endl;
}
private:
int _d4;
};


另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享名称:深入C++对象模型&虚函数表-创新互联
浏览地址:http://www.scyingshan.cn/article/ccpogp.html


咨询
建站咨询
