我真的很困惑。我跑進了以下情況,其中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