信誉好的常州网站建设,seo快排优化,网站和域名的关系,网页设计代码网站近来看了侯捷的《深入浅出MFC》#xff0c;读到C重要性质中的虚函数与多态那部分内容时#xff0c;顿时有了疑惑。因为书中说了这么一句#xff1a;使用“基类之指针”指向“派生类之对象”#xff0c;由该指针只能调用基类所定义的函数#xff0c;如果要让基类的指针使用…近来看了侯捷的《深入浅出MFC》读到C重要性质中的虚函数与多态那部分内容时顿时有了疑惑。因为书中说了这么一句使用“基类之指针”指向“派生类之对象”由该指针只能调用基类所定义的函数如果要让基类的指针使用派生类中定义的函数就将该函数定义为虚函数。 但在“Object slicing与虚函数”这一小节给出了一个及其经典的例子它指出在向上(即向基类)强制转型时会造成对象内容的被切割。 下面用示例进行说明 #include stdafx.h
#include iostream
using namespace std;class A
{
public:virtual void fn(){coutA fnendl;}
};class B: public A
{
public:virtual void fn(){coutB fnendl;}
};int main(int argc, char* argv[])
{B b1;A a1(A)b1;A * a2(A*)b1;a1.fn();a2-fn();return 0;
} 结果如下 通过调试分析其内存模型如下 可知通过A a1(A)b1传值时对象中指向虚函数表的指针__vfptr值不同但是通过A *a2(A*)b1传址操作时对象中指向虚函数表的指针__vfptr值是相同的调用的是类B对象的虚函数表中虚函数fn()。注意对象调用的是哪个类的虚函数就要看类对象的虚函数表中的函数是哪一个。这句话也好理解a1虚函数表中fn()是A::fn()a2虚函数表中fn()是B::fn()所以出现以上结果。 在如下包含父类的父类的继承中 class A { public: virtual void fn(){coutA fnendl;} }; class B: public A { public: virtual void fn(){coutB fnendl;} }; class C: public B { public: }; C c; A a1(C)c; A * a2(C*)c; a1.fn(); a2-fn(); 这时a1虚函数表中fn()为A::fn()a2虚函数表中fn()为B::fn()因为类C对象的虚函数表中fn()为B::fn()a2中指向虚函数表的指针值与类C对象指向虚函数表的指针值相同。 侯捷的书中有句话是这么对它进行解释的由于(A)b1.fn()是传值而非传地址操作编译器以所谓的拷贝构造函数把A对象内容复制了一份使得b1的虚函数表内容与A对象的虚函数表内容相同。 看来得多读圣贤书啊读懂读透啊 转载于:https://www.cnblogs.com/pangblog/p/3327622.html