注册 登录
编程论坛 C++教室

基类指针转换成子类指针后

gz81 发布于 2009-07-30 07:27, 2327 次点击
#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]]
8 回复
#2
pokemonzj2009-07-30 13:23
回复 楼主 gz81
沙发!
不太清楚...
#3
tinjp2009-07-30 17:14
你可以看一下http://blog.
#4
fjwddzzc1232009-07-30 18:01
我模糊记的   基类指针好象不能转换为子类指针,,要不然会越界
#5
黯然神伤2009-07-30 23:38
三楼给的资料确实挺详细的,不过下面的这段还是看不懂,希望高人能指点一二~~~


使用访问虚函数表的方式来访问这些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();

}
#6
wuyun85362009-07-31 11:23
c++primer中说没有从基类到派生类的转换。
#7
fdsflood2009-07-31 13:59
就知道从子类到基类的转换调用虚函数时是动态绑定的,从基类到子类的转换不知道
#8
pangding2009-08-01 23:51
回复 楼主 gz81
答案就是三楼给的那个链接说的那样,解释的很清楚了。
#9
blueskiner2009-08-04 21:08
这当然是输出基类的成员,当一个基类对象被直接初始化为(或直接指定为)一个派生类的对象时,派生类的对象就会被切割,以塞入一个较小的基类型对象内存中去。这个时候多态就失灵了,编译器在编译阶段解释为“通过该对象而触发的虚函数调用操作”因而回避了virtual机制.
   你可以使用下面这个进行亏待内存成本的操作:B *pB = dynamic_cast<B *>(pA);

[[it] 本帖最后由 blueskiner 于 2009-8-4 21:59 编辑 [/it]]
1