单一的一般继承
代码如下:
#include <iostream>
using namespace std;
class Parent {
public:
int iparent;
Parent ():iparent (10) {}
virtual void f() { cout << " Parent::f()" << endl; }
virtual void g() { cout << " Parent::g()" << endl; }
virtual void h() { cout << " Parent::h()" << endl; }
virtual ~Parent() {}
};
class Child : public Parent {
public:
int ichild;
Child():ichild(100) {}
virtual void f() { cout << "Child::f()" << endl; }
virtual void g_child() { cout << "Child::g_child()" << endl; }
virtual void h_child() { cout << "Child::h_child()" << endl; }
virtual ~Child() {}
};
class GrandChild : public Child{
public:
int igrandchild;
GrandChild():igrandchild(1000) {}
virtual void f() { cout << "GrandChild::f()" << endl; }
virtual void g_child() { cout << "GrandChild::g_child()" << endl; }
virtual void h_grandchild() { cout << "GrandChild::h_grandchild()" << endl; }
virtual ~GrandChild() {}
};
typedef void(*Fun)(void);
int main()
{
GrandChild gc;
int** pVtab = (int**)&gc;
Fun pFun = NULL;
cout << "[0] GrandChild::_vptr->" << endl;
for (int i=0; (Fun)pVtab[0][i]!=NULL && i<3; i++)
{
pFun = (Fun)pVtab[0][i];
cout << " ["<<i<<"] ";
pFun();
}
//cout << "[1] Parent.iparent = " << (int)*((int*)(&gc)+1) << endl;
cout << "[1] Child.ichild = " << (int)pVtab[1] << endl;
cout << "[2] Child.ichild = " << (int)pVtab[2] << endl;
cout << "[3] GrandChild.igrandchild = " << (int)pVtab[3] << endl;
return 0;
}
for循环中必须有"i<3"的约束条件,否则会报读内存错误。
对"(int)pVtab[1]"的理解:与(int)*((int*)(&gc)+1)是等价的。这是C语言中获取指针指向内容的两种方式:1)解引用; 2)下标操作。
多重继承
代码如下:
/*
* multiple_inheritance.h
*
* Created on: 2013-10-1
* Author: Administrator
*/
#ifndef MULTIPLE_INHERITANCE_H_
#define MULTIPLE_INHERITANCE_H_
#include <iostream>
using namespace std;
class Base1 {
public:
int ibase1;
Base1():ibase1(10) {}
virtual void f() { cout << "Base1::f()" << endl; }
virtual void g() { cout << "Base1::g()" << endl; }
virtual void h() { cout << "Base1::h()" << endl; }
virtual ~Base1() {}
};
class Base2 {
public:
int ibase2;
Base2():ibase2(20) {}
virtual void f() { cout << "Base2::f()" << endl; }
virtual void g() { cout << "Base2::g()" << endl; }
virtual void h() { cout << "Base2::h()" << endl; }
virtual ~Base2() {}
};
class Base3 {
public:
int ibase3;
Base3():ibase3(30) {}
virtual void f() { cout << "Base3::f()" << endl; }
virtual void g() { cout << "Base3::g()" << endl; }
virtual void h() { cout << "Base3::h()" << endl; }
virtual ~Base3() {}
};
class Derive : public Base1, public Base2, public Base3 {
public:
int iderive;
Derive():iderive(100) {}
virtual void f() { cout << "Derive::f()" << endl; }
virtual void g1() { cout << "Derive::g1()" << endl; }
virtual ~Derive() {}
};
#endif /* MULTIPLE_INHERITANCE_H_ */
int main()
{
GrandChild gc;
int** pVtab = (int**)&gc;
Fun pFun = NULL;
//Base1
cout << "[0] Base1::_vptr->" << endl;
for (int i=0; (Fun)pVtab[0][i]!=NULL && i<3; i++)
{
pFun = (Fun)pVtab[0][i];
cout << " ["<<i<<"] ";
pFun();
}
cout << "[1] Base1.ibase1 = " << (int)pVtab[1] << endl;
//Base2
int s = sizeof(Base1)/4; //Derive类继承在Base1类部分所占内存的大小
cout << "[" << s << "]" << "Base2::_vptr->" << endl;
for (int i=0; (Fun)pVtab[s][i]!=NULL && i<3; i++)
{
pFun = (Fun)pVtab[s][i];
cout << " ["<<i<<"] ";
pFun();
}
cout << "[" << s+1 << "]" << "Base2.ibase2 = " << (int)pVtab[s+1] << endl;
//Base3
s += sizeof(Base2)/4;
cout << "[" << s << "]" << "Base3::_vptr->" << endl;
for (int i=0; (Fun)pVtab[s][i]!=NULL && i<3; i++)
{
pFun = (Fun)pVtab[s][i];
cout << " ["<<i<<"] ";
pFun();
}
cout << "[" << s+1 << "]" << "Base3.ibase3 = " << (int)pVtab[s+1] << endl;
//Derive
s += sizeof(Base3)/4;
cout << "[" << s << "]" << "Derive.iderive = " << (int)pVtab[s] << endl;
return 0;
}
报读内存错误,文章内容未得到验证。通过vs2010查看Derive类对象gc的内存布局和文章说的不一致,如下: