网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月17日漏签0天
c++吧 关注:624,471贴子:2,112,315
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 下一页 尾页
  • 17回复贴,共2页
  • ,跳到 页  
<<返回c++吧
>0< 加载中...

为什么C++中实现多态的基本形式,要显式使用一个指向对象的指针?

  • 只看楼主
  • 收藏

  • 回复
  • CaesarOctavius
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
考考大家一个C++中最基本的概念,同时稍稍卖弄一下
教科书上的例子太多了,我就只写一个大概:
class    A
{
public:     
virtual    void    func(){};
};
class    B:    public    A
{
public:     
void    func(){};
};
A    a;
B    *b    =    static_cast <B    *> (&a);
b-> func();
为什么要使用指针b?
直接:
A    a;
B    b;
A(b).func();      //    这个在语法上是没有问题的
为什么不行?
学过的应该都知道答案,回答不上的的同学们要加油啦!


  • 幻の上帝
  • ->*
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
谁告诉你要用指针了?引用不行么?
谁告诉你C++里面多态就是动态绑定了?
砍掉重练。


2025-07-17 02:03:00
广告
  • CaesarOctavius
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


  • 幻の上帝
  • ->*
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
顺便,LZ的例子里用派生类指针指向基类对象……
你确定A和B没搞反?
嗯,无论如何,b->A::func();毫无压力。


  • count_hassisin
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


  • 午夜血光
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
B     *b     =     static_cast <B     *> (&a);
转换了


  • 午夜血光
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
貌似一般都是
A *pa;
B b;
pa=&b;
pa->func();
的多态的吧。。楼主代码让人蛋疼


  • Copyleft_X
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我是来学习的。。。


2025-07-17 01:57:00
广告
  • Sivolin
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
lz的写法实在是不敢苟同,lz是想要通过将派生类地址赋给基类型的指针,进而运用多态性调用函数?尽量不要把指向派生类的指针转换为基类型的指针,容易出错


  • 飞翔的天地
  • <<
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
只能理解为他脑子抽掉了


  • Son_of_Ligang
  • ^
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
同不理解LZ想法。。。
就好象翻箱倒柜找钥匙。。翻边了没找到。。
结果一拍屁股。。原来钥匙放在屁股兜里。。


  • CaesarOctavius
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这段写错了,我对于多态类的理解有误呀
我的本意是想用模仿这种代码风格实现多态
static_cast
static_cast    <Type>    (Expr)    performs    well-behaved    and    reasonably    well-behaved    casts.    One    of    its    uses    is    to    indicate    explicitly    a    type    conversion    that    is    otherwise    performed    implicitly    by    the    compiler.
For    example
class    Base{};
class    Derived    :    public    Base    {};
void    func(    Derived    *    pd)
{
   Base    *    pb    =    static_cast <Base    *>    (pd);    //explicit
}
这段代码来自于ANSI/ISO    C++    Professional    Programmer 's    Handbook
于是就搞鼓出了这么一段,现在发现大错特错了
书上例子是派生类指针cast成基类指针:
Base    *    pb    =    static_cast <Base    *>    (pd);    //explicit
胡乱写的这段则是基类指针cast成派生类指针:
B    *b    =    static_cast <B    *> (&a);
方向是完全相反的,大错特错呀
衍生类赋值给基类是可行的,通过调用基类实现多态,这是多态的核心,但是反过来,基类赋值给衍生类,调用衍生类是不可以实现多态的,因为数学逻辑推不过去。
可如同说人是动物,这话是正确的,但要说动物是人,这话就错了,大家就不要再打击我了



登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 17回复贴,共2页
  • ,跳到 页  
<<返回c++吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示