示例代码:
class Tbase
{
public:
Tbase();
virtual ~Tbase();
public:
void display()
{
printf("%d,%d",i,j);
}
void set(int i1,int j1)
{
i=i1;j=j1;
}
Tbase* Create()
{
return new Tbase();
}
private:
int i;
int j;
public:
int pi;
};
class FromTbase:public Tbase
{
public:
FromTbase();
~FromTbase();
public:
void display()
{
printf("%d,%d",i,k);
}
void set1(int i1,int k1)
{
i=i1;k=k1;
}
FromTbase* CreateError() //错误的生成的方式
{
return (FromTbase*)Tbase::Create();
}
FromTbase* CreateRight()
{
FromTbase* p=new FromTbase();
p->set(20,30);
return p;
}
void TheFun()
{
Tbase::set(100,200);
Tbase::display();
printf("/n%d,%d,%d",i,k,Tbase::pi);
}
private:
int i;
int k;
};
Tbase::Tbase():i(10),j(20),pi(5)
{
}
Tbase::~Tbase(){}
FromTbase::FromTbase():i(30),k(40),Tbase()
{}
FromTbase::~FromTbase(){}
int _tmain(int argc, _TCHAR* argv[])
{
FromTbase from;
from.TheFun();
return 0;
}
1.从基类继承
FromTBase 从Tbase继承过来.
这意味着FromTBase 拥有一份自己的Tbase的数据拷贝.对于这一份的拷贝的读写的访问权限
请查看相关书和文章.
2. 数据和函数的定义
FromTBase 和 Tbase 可以定义同名的变量和函数.
至于virtual 函数,有特殊作用,请查看相关书和文章
.
3.TheFun()
访函数示意了如何该问FromTBase对象对其所拥有的Tbase拷贝的访问.
4. FromTBase 的对外接口由FromTBase 的公有接口和其继承过来的公有接口两部分来决定.
继承过来的那一部分是公有接口请要看相关书和文章.
5.动态生成
注意到
CreateError() 这是一种很糟糕的想法.
其实质相当于:
在FromBase的一个成员中:
Tbase base;
FromBase* p=(FromBase*)&base;
而实质上:base中只有 Tbase类的数据,而没有FromBase中的数据,
这样会倒导访问越界.
如在main函数中写:
FromTbase from;
FromTbase* p=from.CreateError();
p->set1(20,30);
//在小的程序中,这样可能会运行正常,但其实已隐藏非法访问,在大型程序中则会由此产生该问冲突
为了进行测试.重新定义类如下:
class Tbase
{
public:
Tbase();
virtual ~Tbase();
public:
void display()
{
printf("%d,%d",i,j);
}
void set(int i1,int j1)
{
i=i1;j=j1;
}
Tbase* Create()
{
return new Tbase();
}
private:
int i;
int j;
public:
int pi;
};
class FromTbase:public Tbase
{
public:
FromTbase();
~FromTbase();
public:
void display()
{
printf("%d,%d",i,k);
}
void set1(int i1,int k1)
{
i=i1;k=k1;
}
FromTbase* CreateError() //错误的生成的方式
{
return (FromTbase*)Tbase::Create();
}
FromTbase* CreateRight()
{
FromTbase* p=new FromTbase();
p->set(20,30);
return p;
}
void TheFun()
{
Tbase::set(100,200);
Tbase::display();
printf("/n%d,%d,%d",i,k,Tbase::pi);
}
void setChar()
{
test[1000]='c';
}
private:
int i;
int k;
char test[2000];
};
Tbase::Tbase():i(10),j(20),pi(5)
{
}
Tbase::~Tbase(){}
FromTbase::FromTbase():i(30),k(40),Tbase()
{}
FromTbase::~FromTbase(){}
int _tmain(int argc, _TCHAR* argv[])
{
FromTbase from;
from.TheFun();
FromTbase* p=from.CreateRight();
p->setChar();
FromTbase* p1=from.CreateRight();
p1->setChar();
p=from.CreateError();
p->setChar(); //运行到此外会发生该问冲突
p1=from.CreateError();
p1->setChar();
return 0;
}
6.关于虚函数和纯虚函数
查看书和文章
7. 利用虚函数实现动态运行时调用举例
#include "stdafx.h"
class Tbase
{
public:
Tbase();
virtual ~Tbase();
public:
virtual Set()
{
Buffer[999]='c';
}
virtual void SetExample(Tbase* p)
{
p->Set();
}
private:
char Buffer[1000];
};
class FromTbase:public Tbase
{
public:
FromTbase();
~FromTbase();
virtual Set()
{
i=20;
Tbase::Set();
}
public:
int i;
};
Tbase::Tbase()
{}
Tbase::~Tbase(){}
FromTbase::FromTbase():Tbase()
{}
FromTbase::~FromTbase(){}
typedef std::map<int,FromTbase*> TMap;
int _tmain(int argc, _TCHAR* argv[])
{
FromTbase from;
from.SetExample(&from);
return 0;
}
{
public:
Tbase();
virtual ~Tbase();
public:
virtual Set()
{
Buffer[999]='c';
}
virtual void SetExample(Tbase* p)
{
p->Set();
}
private:
char Buffer[1000];
};
{
public:
FromTbase();
~FromTbase();
virtual Set()
{
i=20;
Tbase::Set();
}
public:
int i;
};
{}
Tbase::~Tbase(){}
{}
typedef std::map<int,FromTbase*> TMap;
{
from.SetExample(&from);