铲灰 2019-05-11 15:55 采纳率: 0%
浏览 135

为什么obj已经强转成基类指针,可以调用f函数

#include
#include
#include
#include
using namespace std;

class base
{
public:
typedef void (base::*func)();
};

class device:public base
{
public:
void f()
{
cout << "ffffff" << endl;
}
};

///我有点不明白,为什么这样可以调用到子类的函数,已经强转到基类了
void change(base::func f, void obj)
{
(((base
)obj)->*f)();
}

int main()
{
device d;

change((base::func)(&device::f), &d);

return 0;

}

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-09 11:39
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在C++中,当您使用typedef声明一个成员函数时,它实际上是为该成员函数创建了一个别名。这意味着您可以将这个别名赋值给一个指针或引用,并且指向同一个成员函数。

    在这个例子中,我们定义了一个别名为func的成员函数,然后将其赋值给了一个基类指针&device::f。由于devicebase的派生类,所以&device::f实际上是一个指向device对象的基类指针。

    因此,当我们调用change()函数并传递一个基类指针作为参数时,实际上是通过间接方式调用了device::f函数,因为这个函数实际上是在device对象上运行的。这与直接调用device::f()是一样的效果,只是这种方式更隐蔽一些。

    所以,答案是:change()函数能够成功地调用子类的函数,即使obj已经是基类指针。这是因为在C++中,通过别名和继承关系,我们可以间接访问子类中的成员函数。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀