有关虚函数,请教各位

darcymei 2003-11-05 06:06:58
#include<iostream>
#include<string>
using namespace std;

class a
{
public:
virtual void fun(void){cout<<"a.fun()"<<endl;}
};

class b: public a
{
public:
void fun(void){cout<<"b.fun()"<<endl; a::fun();}
};

int main()
{
b temp;
temp.fun ();
return 0;
}

我们知道虚函数的实现是动态绑定,在调用时通过this指针查找虚函数表得到。
问题是,我在b中调用a::fun()时,this指针指向的是b的虚函数表,怎么能够查到a的fun()呢?
希望聆听大家的高见。
...全文
82 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
limd 2003-11-06
  • 打赏
  • 举报
回复
一楼回答还可以
Robin 2003-11-06
  • 打赏
  • 举报
回复
UP!~
zhaochong12 2003-11-05
  • 打赏
  • 举报
回复
谢谢..
babyboy321 2003-11-05
  • 打赏
  • 举报
回复
up
hawkxjy 2003-11-05
  • 打赏
  • 举报
回复
只所以能够在虚函数中调用父类的方法,是a::fun()中的类别限定符a::的功劳
,它告诉编译器后面的函数必须是在类a中的函数,起到了限制的作用,而不必
再从虚函数表中匹配。
短歌如风 2003-11-05
  • 打赏
  • 举报
回复
C++提供这种调用方法是为了我们可以在衍生类中重用基类的实现:
#include <iostream>

class Base
{
public:
virtual void foo();
};

void Base::foo()
{
std::cout << "I am a Base!" << std::endl;
}

class Derived: public Base
{
public:
void foo();
};
void Derived::foo()
{
Base::foo();//重用基类的实现
std::cout << "I am a Derived also!" << std::endl;
}

#define TRACK(X) std::cout << "********* " << #X << " ***********" << std::endl, X
main()
{
Base a;
Derived b;
Base *pa;
Derived *pb;
TRACK(a.foo());
TRACK(b.foo());
TRACK(b.Base::foo());
TRACK(pa = & a);
TRACK(pa -> foo());
TRACK(pa -> Base::foo());
TRACK(pa = &b);
TRACK(pa -> foo());
TRACK(pa -> Base::foo());
TRACK(pb = &b);
TRACK(pb -> foo());
TRACK(pb -> Base::foo());
}
运行结果为
********* a.foo() ***********

I am a Base!

********* b.foo() ***********

I am a Base!

I am a Derived also!

********* b.Base::foo() ***********

I am a Base!

********* pa = & a ***********

********* pa -> foo() ***********

I am a Base!

********* pa -> Base::foo() ***********

I am a Base!

********* pa = &b ***********

********* pa -> foo() ***********

I am a Base!

I am a Derived also!

********* pa -> Base::foo() ***********

I am a Base!

********* pb = &b ***********

********* pb -> foo() ***********

I am a Base!

I am a Derived also!

********* pb -> Base::foo() ***********

I am a Base!

短歌如风 2003-11-05
  • 打赏
  • 举报
回复
当你使用a::fun()调用时,它不会去访问b的vtpr,只会直接定位到a::fun去调用。
只有用p->fun//p是一个指针它才会调用虚函数。

在成员函数中调用成员函数时相当于this->...

a::fun()相当于this->a::fun(),这时不访问vtpr。
fun()相当于this->fun(),这时会访问vptr以得到虚函数指针。
内容概要:本文介绍了一个基于Python的WGAN-LSTM混合模型,用于解决复杂时间序列预测问题。该模型结合瓦瑟斯坦生成对抗网络(WGAN)与长短期记忆网络(LSTM),利用LSTM捕捉时间序列中的长期依赖和动态趋势,通过WGAN的生成器与评价器对抗训练,使预测结果不仅贴近真实值,还能更好地保留数据分布特征,如波动性、尖峰和异常变化。项目采用PyTorch实现,涵盖数据预处理、滑动窗口构建、标准化、条件生成器与评价器设计、梯度惩罚机制、联合损失优化及模型评估全流程,并支持多变量输入与不确定性建模,适用于非线性、非平稳、高波动场景的单步预测。; 适合人群:具备Python编程基础和深度学习背景,熟悉PyTorch框架,从事时间序列分析、AI建模或数据科学相关工作的研究人员、工程师及高校学生(建议有1年以上相关经验); 使用场景及目标:①应用于金融价格、电力负荷、设备传感、市场需求等高波动时间序列的精准预测;②实现对未来不确定性的量化表达,支持风险评估、区间预测与情景模拟;③提升传统回归模型对异常波动的识别能力,优化预警与决策系统; 阅读建议:本文提供完整代码结构与核心实现片段,建议结合完整项目代码、数据集和博客文档进行复现与调试,重点关注对抗训练稳定性、梯度惩罚实现及多损失权重平衡策略,以深入掌握WGAN-LSTM在时序建模中的工程应用细节。
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 I2C(Inter-Integrated Circuit)总线是一种在电子设备中广泛应用的串行通信协议,该协议由Philips半导体(现名为NXP半导体)于上世纪80年代提出。I2C总线借助两条线路(时钟线SCL和数据线SDA)完成设备间的控制指令与数据信息的交换,因此它具备多主机与多从机的串行总线特性。在软件层面模拟I2C主从机交互时,常规的IO端口被用于再现I2C主机及从机的通信过程。 I2C总线引脚功能说明: 1. SCL(Serial Clock):时钟线,其时钟信号由主机掌控。 2. SDA(Serial Data):数据线,主要用于承载数据传输。 总线时序规范: - 非活动状态:当总线处于非通信阶段,SDA线保持高电平。 - 总线的线与操作:若多个设备同时接入总线,通过线与逻辑确保任一设备输出低电平,则总线整体呈现低电平状态。 - 数据位稳定性要求:数据位必须在SCL为高电平期间维持稳定状态,而只有在SCL为低电平期间方可发生改变。 - 起始与终止信号的定义:起始信号表现为在SCL高电平期间SDA从高电平转为低电平,终止信号则是在SCL高电平期间SDA从低电平转为高电平。起始信号标志着总线使用周期的起始,终止信号则表示总线使用周期的结束。 - 从机数据处理延时的处理机制:当从机需要额外时间处理数据时,能够将SCL线拉至低电平,促使主机进入等待状态。 - 字节传输与应答机制:一个字节由8位数据加上1位应答位构成。若从机无法应答或已无数据接收需求,将释放SDA线,主机随后产生终止信号。 - 数据帧结构:数据帧以从机地址作为起始,接着是数据传输方向指示位,最后是实际传输...

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧