通过测试代码,目前的结论;
A:类不能强制转换,比如b=(bb)a;错误,function 'int main(int, void**)':
test444.cpp:85:8: error: no matching function for call to 'bb::bb(aa&)'
test444.cpp:85:8: note: candidates are:
test444.cpp:27:7: note: bb::bb()
test444.cpp:27:7: note: candidate expects 0 arguments, 1 provided
test444.cpp:27:7: note: bb::bb(const bb&)
test444.cpp:27:7: note: no known conversion for argument 1 from 'aa' to 'const bb&'
但是a=(aa)b正确,原因不明。
B: 类地址可以通过指针强制转。比如 b=*(bb *)&a;但是只是修改了变量,对于VTABLE表不予修改。
c: 通过找a,b地址可以修改VTABLE..通过指针传参能够发现多态被修改。
d: a.testxiongyf ,b.testxiongyf 的调用方式还是预编译的时候直接指明,不是通过指针。
(&a)->testxiongyf ,(&b)->testxiongyf则可实现多态。通过指针。
特别强调。
这里说的不够准确。通过测试发现。(&a)->testxiongyf ,(&b)->testxiongyf等价于a.testxiongyf和b.testxiongyf.
而不是指针了。所以如果必须要多态,一定要另外重新定义一个变量来保存指针。
aa *c=&a;c->xiongyf();这样就可以实现。
同时测试发现
k4->testxiongyf()等价于 (*k4).testxiongyf();
他们都是以指针方式访问,也就是寄存器的间接访问方式。
所以不要通过.和->来区分用哪种方式。而是通过是以间接方式方式还是直接方式方式。
直接方式,实际上就是编译器阶段通过对象类型调用。
间接方式,实际上是运行中通过指针来确认调用。
#include "stdio.h"
class TEST
{
int a;
int b;
public :
virtual void testxiongyf()
{
printf("test111\n");
}
};
class TEST2:public TEST
{
public:
virtual void testxiongyf()
{
printf("test222\n");
}
};
int test(TEST *AA)
{
// AA.testxiongyf();
AA->testxiongyf();
(*AA).testxiongyf();
}
int main(int argc,char *argv[] )
{
TEST k3;
TEST2 k2;
TEST *k1=&k2;
TEST2 *k4;
TEST *k5;
printf("%d\n");
k1->testxiongyf();
k3= *(TEST*)&k2;
k4=(TEST2 *)&k3;
k3.testxiongyf();
(&k3)->testxiongyf();
//*(int *)&k3=*(int*)&k2;
(&k3)->testxiongyf();
k5=&k3;
k5->testxiongyf();
k3.testxiongyf();
printf("k3 %x,k4 %x\n",&k3,k4);
k4->testxiongyf();
(*k4).testxiongyf();
// test(&k3);
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
#include <stdio.h>
class aa
{
public:
int a;
virtual void testxiongyf()
{
printf("aa function\n");
}
};
class bb:public aa
{
public:
int b;
virtual void testxiongyf(){printf("bb function\n");}
};
void test(aa * b)
{
b->testxiongyf();
}
void jj(void *p,void *d)
{
int *a=(int *)p;
int *b=(int *)d;
*b=*a;
}
int main(int argc ,void *argv[])
{
aa a;
bb b;
int *ap,*bp;
a.a=1;
b.b=2;
//*ap=*bp;
printf("11111111111111----%x\n",a.a,b.b);
//b=(bb)a;
b=*(bb *)&a;
printf("22222222222222----%x\n",a.a,b.b);
printf("iolvyou!!!%x\n",&aa::testxiongyf);
//d=&aa::testxiongyf;
test(&a);
test(&b);
a.testxiongyf();
b.testxiongyf();