弱弱问问
#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();
class Base { public: Base() { Init(); } virtual void Init() { cout <<"Base Init" <<endl; } virtual void func() { cout <<"Base func" <<endl; } };
[解决办法]
编译器借助虚拟函数表实现了动态联编。
#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(); }