c++多态调用的问题

跟随我 2018-05-30 10:42:31

class A
{
virtual void printf(){std::cout<<"A"<<std::endl;}
};

class B :public A
{
virtual void printf(){std::cout<<"B"<<std::endl;}
}


我如果不知道 B是子类的情况下,如何调B类的 printf函数;

我感觉不知道应该是不行,那为什么 MFC中,继承一个窗口类,系统就可以调用里面虚函数

这个MFC是通过什么技术实现的
...全文
1035 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2018-06-05
  • 打赏
  • 举报
回复
多态的调用就是在不需要知道子类的情况下,可以调用子类的函数。 如果知道了子类,就不需要多态了。 具体的实现是,虚基类有一个虚函数表,所有的虚函数的入口都在这个表里面。 使用虚基类的引用来调用这些函数的时候,通过这个表找到入口地址,在修正过 this 之后,就可以直接呼叫这个入口指向的函数了。 而这个虚函数表在子类实例化的时候(此时需要明确知道子类是谁),被子类的构造函数改写(如果重写虚函数),把自己的重写的函数入口写入这个表。 不是直接的重写函数,而是使用一个转换函数,这个函数负责修正 this 指针。
schlafenhamster 2018-06-05
  • 打赏
  • 举报
回复
// if window is CTreeCtrl if (pDropWnd->IsKindOf (RUNTIME_CLASS (CTreeCtrl))) { } else if (pDropWnd->IsKindOf (RUNTIME_CLASS (CListCtrl))) { }
跟随我 2018-06-05
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:
"我如果不知道 B是子类的情况下" GetClassName IsKindOf(RUNTIME_CLASS(Cxxxx)));
可以说详细些不
跟随我 2018-06-05
  • 打赏
  • 举报
回复
引用 5 楼 oyljerry 的回复:
MFc在基类定义了对应的虚函数,它会决定什么情况就调用哪个虚函数,你子类实现了,自然就可以通过多态调用到你的实现
子类实现了,但实例化的时候,怎么确定子类的? 我主要是想了解一下,里面的技术, 我说的情况是,我并不能确定子类: A* pB= new B; 子类B是动态的不是已知,像窗口的类,MFC也不能确定子类,它是如何实例化出来的。
schlafenhamster 2018-06-04
  • 打赏
  • 举报
回复
"我如果不知道 B是子类的情况下" GetClassName IsKindOf(RUNTIME_CLASS(Cxxxx)));
tiger波波 2018-06-04
  • 打赏
  • 举报
回复
这种情况不存在吧?你能生成B类的实例,必定include了B类的头文件,B类的头文件必定写明了B类继承与A
schlafenhamster 2018-05-31
  • 打赏
  • 举报
回复
对象(实例)的虚函数表 里是 自己的 虚函数。
oyljerry 2018-05-31
  • 打赏
  • 举报
回复
MFc在基类定义了对应的虚函数,它会决定什么情况就调用哪个虚函数,你子类实现了,自然就可以通过多态调用到你的实现
待续_1006 2018-05-31
  • 打赏
  • 举报
回复
MFC已经把你需要做的更你封装好了,不然干嘛被称为库呢
zgl7903 2018-05-31
  • 打赏
  • 举报
回复
sichuanwww 2018-05-31
  • 打赏
  • 举报
回复
MFC有一个公共的祖先CObject,虚函数是多态的必备,用指针就能执行子类的实现函数。
schlafenhamster 2018-05-31
  • 打赏
  • 举报
回复
搜索“对象(实例)的虚函数表”
worldy 2018-05-31
  • 打赏
  • 举报
回复
class A { virtual void printf(){std::cout<<"A"<<std::endl;} }; class B :public A { virtual void printf(){std::cout<<"B"<<std::endl;} } void aFun() { A* pA=new A; A* pB= new B; pA->printf();//调用的是A类的函数 pB->printf();//因为pB由B类创建,因此自动的调用B类的函数,这就是多态的魅力,使用者不需要知道是来自什么类,但是会自动的调用合适的函数 }
Saleayas 2018-05-30
  • 打赏
  • 举报
回复
当你实例化的时候,已经知道 B 了。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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