您的位置:首页 > 编程语言 > C语言/C++

c++ 类继承中父类和子类的数据关系

2008-05-20 11:06 381 查看
示例代码:
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;

}

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;

}
建议阅读:重载、覆盖、多态与函数隐藏
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: