首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

弱弱问问解决思路

2012-02-04 
弱弱问问#include iostream.hclass Base{public:Base(){Init()}virtual void Init(){coutBase Init

弱弱问问
#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(); } 

热点排行