读书人

弱弱问问解决思路

发布时间: 2012-02-04 15:43:08 作者: rapoo

弱弱问问
#include "iostream.h"

class Base
{
public:
Base()
{
Init();
}
virtual void Init()
{
cout<<"Base Init"<<endl;
}
void func()
{
cout<<"Base func"<<endl;
}
};

class Derived : public Base
{
public:
virtual void Init()
{
cout<<"Derived Init"<<endl;
}
void func()
{
cout<<"Derived func"<<endl;
}
};

void main()
{
Derived d;
((Base *) &d)->func();
}
输出是:
Base Init
Base func
对于第二个输出不懂啊?为什么就不能完成动态联编呢?下面的程序就可以啊!
#include "iostream.h"

class A
{
public:
virtual void Test()
{
cout<<"A test\n"<<endl;
}
};
class B:public A
{
public:
void func()
{
Test();
}
virtual void Test()
{
cout<<"B test\n"<<endl;
}
};

class C:public B
{
public:
virtual void Test()
{
cout<<"C test\n"<<endl;
}
};

void main()
{
C c;
((B*)(&c))->func();
}

输出:
C test
谢谢达人解惑!^_^

[解决办法]
如果第一个基类加个virtual,就会调用Derived 的函数了
因为使用的不是虚函数,子类转基类,造成了截断,指针指向的都是基类的数据和成员
你也可以尝试一下((Base *) &d)->Init();

C/C++ code
class Base { public:     Base()     {         Init();     }     virtual void Init()     {         cout <<"Base Init" <<endl;     }     virtual void func()     {         cout <<"Base func" <<endl;     } };
[解决办法]
编译器借助虚拟函数表实现了动态联编。

C/C++ code
#include "stdafx.h" #include "iostream.h" class Base { public:     Base()     {         Init();     }     virtual void Init()     {         cout <<"Base Init" <<endl;     }     virtual void func()     {         cout <<"Base func" <<endl;     } }; class Derived : public Base { public:     virtual void Init()     {     cout <<"Derived Init" <<endl;     }     void func()     {     cout <<"Derived func" <<endl;     } }; void main() {     Derived d;     ((Base *) &d)->func(); } 

读书人网 >C++

热点推荐