c – 多态和成员函数指针如何工作?

c – 多态和成员函数指针如何工作?,第1张

概述参见英文答案 > Pointers to virtual member functions. How does it work?                                    3个 我有以下代码: #include <iostream>using namespace std;class Base {public: virtual void WhoAmI() 参见英文答案 > Pointers to virtual member functions. How does it work?                                    3个
我有以下代码:

#include <iostream>using namespace std;class Base {public:    virtual voID WhoAmI() const;    typedef voID (Base::*WhoPtr)() const;};class Derived : public Base {public:    virtual voID WhoAmI() const;};voID Derived::WhoAmI() const {    cout << "I am the derived" << endl;}voID Base::WhoAmI() const {    cout << "I am the base" << endl;}int main() {    Base::WhoPtr func = &Base::WhoAmI;    Base theBase;    (theBase.*func)();    Derived theDerived;    (theDerived.*func)();    cin.get();    return 0;}

让我们关注主要:

int main() {    Base::WhoPtr func = &Base::WhoAmI;    Base theBase;    (theBase.*func)();    Derived theDerived;    (theDerived.*func)();    cin.get();    return 0;}

我们有一个局部变量func,它拥有Base :: WhoAmI的地址.

此外,我们有Base和Derived对象.

在第2行,我们从基数调用指向的函数:(theBase.* func)().

直到现在我才明白.

之后的2行,我们从派生中调用它:( theDerived.* func)().

它打印:我是派生的.为什么?

两个WhoAmI都是虚拟的,这意味着调用依赖于指向对象,而不是类型.

指向的对象是属于Base的func.为什么打印我是派生而不是我的基础?

解决方法 你为什么惊讶.你有一个指向成员函数的指针 指向虚拟功能.如果你拿了地址 theDerived或对它的引用,并初始化Base *或 一个基地&有了它,你期望ptrToBase-> WhoAmI()来调用 派生类中的函数.毕竟,这就是你使用的原因 一个虚拟的功能开始.当你这么做时 通过指向成员函数的指针调用.表达方式 & Base :: WhoAmI产生指向(虚拟)成员函数的指针. 总结

以上是内存溢出为你收集整理的c – 多态和成员函数指针如何工作?全部内容,希望文章能够帮你解决c – 多态和成员函数指针如何工作?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1226794.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存