#include "stdafx.h"
#include <iostream>
#include "stdafx.h"
using namespace std;
class Tree
{
public:
int b;
virtual void Branch(){printf("Tree::Branch\r\n");}
virtual void Branch1(){ printf("Tree::Branch1\r\n"); }
virtual void Branch2(){ printf("Tree::Branch2\r\n"); }
void Test(){ printf("Tree::Test\r\n"); }
void Test1(){ printf("Tree::Test\r\n"); }
};
class Peach_Trees:public Tree
{
public:
virtual void Branch(){ printf("Peach_Trees::Branch\r\n"); }
virtual void Branch3(){ printf("Peach_Trees3::Branch\r\n"); }
virtual void Branch4(){ printf("Peach_Trees4::Branch\r\n"); }
void Test(){ printf("Peach_Trees::Test\r\n"); }
};
//
class A
{
public:
virtual void Branch() = 0;
virtual void Branch1() = 0;
virtual void Test(){ printf("Test\r\n"); }
int a;
};
void A::Branch()
{
printf("virtual\r\n");
}
class B :public A
{
public:
virtual void Branch(){ }
virtual void Branch1(){ printf("B::Branch1\r\n"); }
virtual void Branch2(){ printf("B::Branch2\r\n"); }
virtual void Branch3(){ printf("B::Branch3\r\n"); }
};
/
class virtualA
{
public:
virtual void Branch(){ printf("virtualA::Branch\r\n"); }
};
class virtualB :virtual public virtualA
{
public:
virtual void Branch(){ printf("virtualB::Branch\r\n"); }
};
class virtualC :virtual public virtualA
{
public:
virtual void Branch(){ printf("virtualC::Branch\r\n"); }
};
class virtualD :public virtualB, public virtualC
{
public:
virtual void Branch(){ printf("virtualD::Branch\r\n"); }
};
#define private public
class X
{
public:
int a;
private:
int b;
};
//虚函数表在编译时创建
//如果一个类里有虚函数自动创建一个虚函数表,此表存储这个类虚函数地址
//每个虚函数表占4个字节,在对象类的最前面
//虚函数表分配在对象的内存中,通过基类指针操作
//虚函数表地址固定不变,大小和内容也不会改变
//虚函数可通过作用域::或者__super访问基类
//对象的地址就是虚函数表基址,虚表的位置以对象类的位置为标准
//纯虚函数没有内存地址,所以不能定义
//纯虚函数是特殊的虚函数,是因为基类不能给出有效定义所以留着让子类定义
//纯虚函数,实现必须由派生类实现,虚函数则不用必须实现
//纯虚函数不能定义对象
//函数,一段代码,实现某个功能
//虚函数,一段代码,实现某个功能,子类改写功能
//纯虚函数,一般只有声明,没有代码,必须由子类实现功能
int _tmain(int argc, _TCHAR* argv[])
{
X x;
x.b = 2;
int d = x.b;
Tree m_tree;
Peach_Trees m_peach_trees;
printf("-----------tree--------------------\r\n");
Tree *pTree = &m_tree;
pTree->Branch();
printf("大小%d\r\n", sizeof(m_tree));
printf("函数地址%p\r\n", *(int*)&pTree);//函数地址
printf("函数表地址%p\r\n", *(int*)*(int*)&pTree);//虚函数表地址
printf("虚函数1地址%p\r\n", *(int*)*(int*)*(int*)&pTree);//虚函数1地址
printf("虚函数2地址%p\r\n", *((int*)*(int*)*(int*)&pTree + 1));//虚函数2地址
printf("虚函数3地址%p\r\n", *((int*)*(int*)*(int*)&pTree + 2));//虚函数3地址
printf("-----------peach_trees--------------------\r\n");
pTree = &m_peach_trees;
pTree->Branch();
pTree->Test();
pTree->Tree::Branch();
printf("大小%d\r\n", sizeof(m_tree));
printf("函数地址%p\r\n", *(int*)&pTree);//函数地址
printf("虚函数表地址%p\r\n", *(int*)*(int*)&pTree);//虚函数表地址
printf("虚函数1地址%p\r\n", *(int*)*(int*)*(int*)&pTree);//虚函数1地址
printf("虚函数2地址%p\r\n", *((int*)*(int*)*(int*)&pTree + 1));//虚函数2地址
printf("虚函数3地址%p\r\n", *((int*)*(int*)*(int*)&pTree + 2));//虚函数3地址
printf("虚函数4地址%p\r\n", *((int*)*(int*)*(int*)&pTree + 3));//虚函数4地址
printf("虚函数5地址%p\r\n", *((int*)*(int*)*(int*)&pTree + 4));//虚函数4地址
printf("-----------------纯虚函数--------------\r\n");
B b;
A *pA = &b;
pA->Branch();
pA->A::Branch();//不懂有什么用
pA->Test();
printf("大小%d\r\n", sizeof(pA));
printf("函数地址%p\r\n", *(int*)&pA);//函数地址
printf("虚函数表地址%p\r\n", *(int*)*(int*)&pA);//虚函数表地址
printf("虚函数1地址%p\r\n", *(int*)*(int*)*(int*)&pA);//虚函数1地址
printf("虚函数2地址%p\r\n", *((int*)*(int*)*(int*)&pA + 1));//虚函数2地址
printf("虚函数3地址%p\r\n", *((int*)*(int*)*(int*)&pA + 2));//虚函数3地址
printf("虚函数4地址%p\r\n", *((int*)*(int*)*(int*)&pA + 3));//虚函数4地址
printf("-----------------虚基类--------------\r\n");
virtualA virA;
virtualB virB;
virtualC virC;
virtualD virD;
virtualA *pVir = &virA;
pVir->Branch();
pVir = &virB;
pVir->Branch();
pVir = &virC;
pVir->Branch();
pVir = &virD;
pVir->virtualA::Branch();
pVir->Branch();
printf("--------------由子派生类转换派生类-----------------\r\n");
virtualB *pVirB = dynamic_cast<virtualB*>(pVir);
pVirB->virtualB::Branch();
virtualC *pVirC = dynamic_cast<virtualC*>(pVir);
pVirC->virtualC::Branch();