64,637
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <string>
class A
{
public:
void afun()
{
std::cout << am;
}
std::string am;
};
class B
{
public:
void bfun()
{
std::cout << bm;
}
std::string bm;
};
class C:public A,public B
{
public :
void cfun()
{
std::cout << cm;
}
std::string cm;
};
int main()
{
C ci;
ci.am = "aaaaa";
ci.bm = "bbbbb";
ci.cm = "ccccc";
B * pb = &ci;
// case 1: 5.2.9.9 ISO/IEC 14882:2003(E)
void (A::*pam)() = &A::afun;
void (C::*pcm)() = &C::cfun;
void (B::*pbm)() = static_cast<void (B::*)()>(pcm); // VS2012 says: warning C4407: 在指向成员表示形式的不同指针之间进行转换,编译器可能生成不正确的代码
(pb->*pbm)();
// case 2: 5.2.10.9 ISO/IEC 14882:2003(E)
pcm = reinterpret_cast<void (B::*)()>(pcm); // VS2012 says :error C2440: “reinterpret_cast”: 无法从“void (__thiscall C::* )(void)”转换为“void (__thiscall B::* )(void)”
// 你妹,static_cast 都能过的,reinterpret_cast就变错误了.
system("pause");
return 0;
};
class B
{
public:
B(void) : m("bbbb") {};
void foo(void) const { std::cout << m << std::endl; };
std::string m;
};
class D : public B
{
public:
D(void) : m("dddd") {};
std::string m;
};
int _tmain(int /*argc*/, _TCHAR* /*argv*/[])
{
D o1;
B * p = &o1;
void (B::* p1)(void) const;
void (D::* p2)(void) const;
p2 = &D::foo;
p1 = &D::foo; // rvalue. OK.
//p1 = p2; // lvalue. Error.
(p->*p1)();
_getch();
return 0;
}
class A
{
public:
A(void) : m("aaaa") {};
void f1(void) const
{
std::cout << m << std::endl;
};
virtual void f2(void) const
{
std::cout << m << std::endl;
};
std::string m;
};
class B1 : public A
{
public:
B1(void) : m("bbbb1") {};
std::string m;
};
class B2 : public A
{
public:
B2(void) : m("bbbb2") {};
void f2(void) const
{
std::cout << m << std::endl;
};
std::string m;
};
class C1
{
public:
C1(void) : m("cccc1") {};
void f3(void) const
{
std::cout << m << std::endl;
};
virtual void f2(void) const
{
std::cout << m << std::endl;
};
std::string m;
};
class D : public A, public C1
{
public:
D(void) : m("dddd") {};
void f2(void) const
{
std::cout << m << std::endl;
};
std::string m;
};
int _tmain(int /*argc*/, _TCHAR* /*argv*/[])
{
{
B1 o1;
A * pa = &o1;
void (A::* p1)(void) const = &B1::f1;
(pa->*p1)();
}
{
B2 o1;
A * pa = &o1;
void (A::* p1)(void) const = &A::f2;
(pa->*p1)();
}
{
D o1;
A * pa = &o1;
C1 * pc = &o1;
void (A::* p1)(void) const = &A::f2;
void (C1::* p2)(void) const = &D::f3;
(pa->*p1)();
(pc->*p2)();
p2 = &C1::f2;
(pc->*p2)();
}
_getch();
return 0;
}
sizeof(C) = 12
sizeof(B) = 4
p1: 0037FCE8
C this 0037FCE8, data -858993460
p2: 0037FCCC
C this 0037FCCC, data -858993460
请按任意键继续. . .
#include <stdio.h>
class A
{
public:
A():data(1){}
void afun()
{
printf("A this %p, data %d\n", (void*)this, data);
}
int data;
};
class B
{
public:
B():data(2){}
void bfun()
{
printf("B this %p, data %d\n", (void*)this, data);
}
int data;
};
class C:public A,public B
{
public :
C():data(3){}
void cfun()
{
printf("C this %p, data %d\n", (void*)this, data);
}
int data;
};
int main()
{
printf("sizeof(C) = %u\n", sizeof(C));
printf("sizeof(B) = %u\n", sizeof(B));
C ci;
int arr[1] = {98765};
B bi;
B *p1 = &ci;
B *p2 = &bi;
void (A::*fpa)() = &A::afun;
void (B::*fpb)() = &B::bfun;
void (C::*fpc)() = &C::cfun;
{
void (B::*fp)() = static_cast<void (B::*)()>(fpc);
printf("p1: %p\n", (void*)p1);
(p1->*fp)(); // output is 3 !!!
}
{
void (B::*fp)() = static_cast<void (B::*)()>(fpc);
printf("p2: %p\n", (void*)p2);
(p2->*fp)(); // output is 98765 ???
}
return 0;
};
结果
[root@localhost src]# ./a.out
sizeof(C) = 12
sizeof(B) = 4
p1: 0xbfa03040
C this 0xbfa0303c, data 3
p2: 0xbfa03034
C this 0xbfa03030, data 98765
C ci;
ci.am = "aaaaa";
ci.bm = "bbbbb";
ci.cm = "ccccc";
B * pb = &ci;
A * pa = &ci;
// case 1: 5.2.9.9 ISO/IEC 14882:2003(E)
void (A::*pam)() = &A::afun;
void (C::*pcm)() = &C::cfun;
void (B::*pbm)() = static_cast<void (B::*)()>(pcm); // VS2012 says: warning C4407: 在指向成员表示形式的不同指针之间进行转换,编译器可能生成不正确的代码
(pb->*pbm)();
void (A::*pam2)() = static_cast<void (A::*)()>(pcm);
(pa->*pam2)();