我真的很困惑。我跑进了以下情况,其中C从A和B都继承,但根据事情是如何分配的,我得到不同的行为:从基类指针访问派生类成员
如果我
new
一个C
实例,并将其存储在一个A
指针,然后将它的值分配给B
指针,并使用A
指针调用A
的方法,并使用B
指令的方法调用B
指针,我得到奇怪的东西......(请参阅测试1)。如果我
new
一个C
实例,并将其存储在一个C
指针,然后分配给它的价值的A
和B
指针,并调用使用A
指针的A
的方法,以及B
与B
的方法指针,我得到我期望的...(见测试2)。
我的问题是:为什么测试1的行为方式呢?
A类
class A
{
public:
A() { aMember = 'A'; }
virtual ~A() {}
virtual char getAMember() { return aMember; }
private:
char aMember;
};
B类
class B
{
public:
B() { bMember = 'B'; }
virtual ~B() {}
virtual char getBMember() { return bMember; }
private:
char bMember;
};
C类
class C : public A, public B
{
public:
C() : A(), B() {}
virtual ~C() {}
};
主要有Test1的&的Test2
#include <cstdio>
int main(void)
{
C* c;
A* a;
B* b;
printf("Test 1\n");
a = new C();
b = (B*)a;
printf("a->getAMember(): %c\n",a->getAMember()); // prints A
printf("b->getBMember(): %c\n",b->getBMember()); // prints A ?!
printf("Test 2\n");
c = new C();
a = c;
b = c;
printf("a->getAMember(): %c\n",a->getAMember()); // prints A
printf("b->getBMember(): %c\n",b->getBMember()); // prints B
return 0;
}
指针转换的危险之处在于编译器会让你做到,即使它没有意义。 – 2015-03-31 14:46:57
你也可以考虑阅读以下文章:http://stackoverflow.com/questions/9374244/casting-pointer-to-base-class-into-a-pointer-to-derived-class – 2015-03-31 14:52:06