以下代碼運行環境:windows8.1 32位 VS2015
//單一繼承,無虛函數
class A
{
public:
A(int a = 0, char c = 0)
:_a(a)
, _c(c)
{}
int GetA()
{
return _a;
}
static int staticFun()
{
return _val;
}
static int _val;
private:
int _a;
char _c;
};
class B :public A
{
public:
B(char b = 0)
:_b(b)
{}
char GetB()
{
return _b;
}
private:
char _b;
};
int A::_val = 100;
void test1()
{
A a(10,'a');
B b('b');
}
class A
{
public:
virtual void foo()
{
cout << "A::foo()" << endl;
}
virtual void funA()
{
cout << "A::funA()" << endl;
}
private:
int _a;
char _c;
};
class B :public A
{
public:
virtual void foo()
{
cout << "B::foo()" << endl;
}
virtual void funB()
{
cout << "B::funB()" << endl;
}
private:
char _b;
};
void test2()
{
A a;
B b;
}
內存分佈:結合程序的調試進行分析:
void PrintTable(int* vTable)
{
typedef void(*pFun)();
cout << "虛表地址爲:" << vTable << endl;
for (int i = 0; vTable[i] != NULL; ++i)
{
printf("第%d個虛表地址爲:%p->", i, vTable[i]);
pFun f = (pFun)vTable[i];
f();
}
cout << endl;
}
void test2()
{
A a;
B b;
int* vTable1 = (int*)(*(int*)&a);
int* vTable2 = (int*)(*(int*)&b);
PrintTable(vTable1);
PrintTable(vTable2);
}
運行結果:class A
{
public:
virtual void foo()
{
cout << "A::foo()" << endl;
}
virtual void funA()
{
cout << "A::funA()" << endl;
}
private:
int _a;
};
class B
{
public:
virtual void foo()
{
cout << "B::foo()" << endl;
}
virtual void funB()
{
cout << "B::funB()" << endl;
}
private:
int _b;
};
class C :public A, public B
{
public:
virtual void foo()
{
cout << "C::foo()" << endl;
}
virtual void funC()
{
cout << "C::funC()" << endl;
}
private:
int _c;
};
void test3()
{
C c;
}
下邊我們先通過調試信息,看看對象的內存分佈:通過這個圖,我們就可以畫出多繼承的對象的內存分佈:
void PrintTable(int* vTable)
{
typedef void(*pFun)();
cout << "虛表地址爲:" << vTable << endl;
for (int i = 0; vTable[i] != NULL; ++i)
{
printf("第%d個虛函數地址爲:0x%p->", i, vTable[i]);
pFun f = (pFun)vTable[i];
f();
}
cout << endl;
}
void test3()
{
C c;
int* vTable = (int*)(*(int*)&c);
PrintTable(vTable);
vTable = (int *)(*((int*)&c + sizeof(A) / 4));
PrintTable(vTable);
}
程序運行結果:class A
{
public:
A()
:_a(1)
{}
virtual void foo()
{
cout << "A::foo()" << endl;
}
virtual void funA()
{
cout << "A::funA()" << endl;
}
private:
int _a;
};
class B : public virtual A
{
public:
B()
:_b(2)
{}
virtual void foo()
{
cout << "B::foo()" << endl;
}
virtual void funB()
{
cout << "B::funB()" << endl;
}
private:
int _b;
};
class C : public virtual A
{
public:
C()
:_c(3)
{}
virtual void foo()
{
cout << "C::foo()" << endl;
}
virtual void funC()
{
cout << "C::funC()" << endl;
}
private:
int _c;
};
class D :public B, public C
{
public:
D()
:_d(4)
{}
virtual void foo()
{
cout << "D::foo()" << endl;
}
virtual void FunD()
{
cout << "D::funD()" << endl;
}
private:
int _d;
};