| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2327 人关注过本帖
标题:基类指针转换成子类指针后
只看楼主 加入收藏
gz81
Rank: 5Rank: 5
等 级:职业侠客
帖 子:137
专家分:369
注 册:2008-5-1
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
基类指针转换成子类指针后
#include <iostream>

using namespace std;

class A {
public:
    virtual void fun0() {
        cout << "A::fun0 (virtual)" << endl;
    }
        void fun1() {
        cout << "A::fun1" << endl;
    }
        void fun2() {
        cout << "A::fun2" << endl;
    }

};
class B : public A {
public:

    void fun0() {
        cout << "B::fun0 (virtual)" << endl;
    }
    void fun1() {
        cout << "B::fun1" << endl;  
    }
        void fun3() {
        cout << "B::fun3" << endl;
    }

};

int main() {
    A *pa=new A;
    B *pb=(B*)pa;

    pb->fun0();
    pb->fun1();
    pb->fun2();
    pb->fun3();
    
    return 0;
}

以下是打印结果,哪位朋友可详细解释一下是为什么?主要是第一个不明白为什么输出的不是B::fun0 (virtual)
A::fun0 (virtual)  
B::fun1
A::fun2
B::fun3

[[it] 本帖最后由 gz81 于 2009-7-30 07:33 编辑 [/it]]
搜索更多相关主题的帖子: 子类 指针 基类 
2009-07-30 07:27
pokemonzj
Rank: 2
等 级:论坛游民
帖 子:15
专家分:21
注 册:2009-7-23
收藏
得分:0 
回复 楼主 gz81
沙发!
不太清楚...
2009-07-30 13:23
tinjp
Rank: 5Rank: 5
等 级:职业侠客
帖 子:52
专家分:340
注 册:2006-11-4
收藏
得分:8 
你可以看一下http://blog.
2009-07-30 17:14
fjwddzzc123
Rank: 2
等 级:论坛游民
帖 子:56
专家分:79
注 册:2009-5-7
收藏
得分:3 
我模糊记的   基类指针好象不能转换为子类指针,,要不然会越界
2009-07-30 18:01
黯然神伤
Rank: 2
等 级:论坛游民
帖 子:18
专家分:39
注 册:2009-2-5
收藏
得分:0 
三楼给的资料确实挺详细的,不过下面的这段还是看不懂,希望高人能指点一二~~~


使用访问虚函数表的方式来访问这些non-public的虚函数
如:

class Base {

private:

virtual void f() { cout << "Base::f" << endl; }

};

class Derive : public Base{

};

typedef void(*Fun)(void);

void main() {

Derive d;

Fun pFun = (Fun)*((int*)*(int*)(&d)+0);

pFun();

}
2009-07-30 23:38
wuyun8536
Rank: 2
等 级:论坛游民
帖 子:21
专家分:77
注 册:2009-6-7
收藏
得分:3 
c++primer中说没有从基类到派生类的转换。
2009-07-31 11:23
fdsflood
Rank: 1
等 级:新手上路
帖 子:4
专家分:3
注 册:2009-7-31
收藏
得分:3 
就知道从子类到基类的转换调用虚函数时是动态绑定的,从基类到子类的转换不知道
2009-07-31 13:59
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:3 
回复 楼主 gz81
答案就是三楼给的那个链接说的那样,解释的很清楚了。
2009-08-01 23:51
blueskiner
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:227
专家分:707
注 册:2008-9-22
收藏
得分:0 
这当然是输出基类的成员,当一个基类对象被直接初始化为(或直接指定为)一个派生类的对象时,派生类的对象就会被切割,以塞入一个较小的基类型对象内存中去。这个时候多态就失灵了,编译器在编译阶段解释为“通过该对象而触发的虚函数调用操作”因而回避了virtual机制.
   你可以使用下面这个进行亏待内存成本的操作:B *pB = dynamic_cast<B *>(pA);

[[it] 本帖最后由 blueskiner 于 2009-8-4 21:59 编辑 [/it]]
2009-08-04 21:08
快速回复:基类指针转换成子类指针后
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042735 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved