虚函数,纯虚函数,适合新手



#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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值