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;
}
建议阅读:重载、覆盖、多态与函数隐藏
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;
}
建议阅读:重载、覆盖、多态与函数隐藏
相关文章推荐
- C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象
- C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象
- c++ --> 父类与子类间的继承关系
- 理解c++对象模型,子类与父类关系
- C++继承(1) - 基类哪些数据会被子类继承下来?
- 子类继承父类的变量和父类原有变量的关系
- 当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。
- C++父类与子类关系以及函数重载、覆盖和隐藏规则
- 继承的概念:继承是指类与类之间的继承关系 ,子类继承父类,子类可以将父类的属性方法继承下来 网址:www.iphonetrain.com 以下代码是了车类与出租车类 共同继承了Car属性
- C++父类与子类关系以及函数重载、覆盖和隐藏规则 http://blog.csdn.net/xingyu19871124/article/details/7640131
- Java继承中子类与父类的关系
- 继承中子类和父类构造方法的关系
- C++父类与子类关系以及函数重载、覆盖和隐藏规则
- c++子类继承父类的覆盖问题
- c++子类能从父类中继承父类的静态成员函数吗
- c++继承父类的子类,如何调用父类的同名函数?
- Activity的生命周期(三)——结合Activity的生命周期理解子类继承父类预加载数据
- 子类继承父类的变量和父类原有变量的关系
- Java 继承 父类变量, 方法 与子类的关系:
- 子类将继承父类所有的数据域和方法