继承派生产生的切割问题


 1 #include <iostream>
2 #include <string>
3 using namespace std;
4 class people
5 {
6 public:
7 string name;
8 int age;
9 virtual void print();
10 };
11
12 class teacher:public people
13 {
14 public:
15 int wage;
16 virtual void print();
17
18 };
19
20 void main()
21 {
22 people p1;
23 teacher t1;
24 t1.name="lili";
25 t1.age=31;
26 t1.wage=4200;
27 p1=t1;
28 p1.print();
29 cout<<endl<<endl;
30 t1.print();
31
32 }
33 void people::print()
34 {
35 cout<<name<<endl;
36 cout<<age<<endl;
37 }
38 void teacher::print()
39 {
40 cout<<name<<endl;
41 cout<<age<<endl;
42 cout<<wage<<endl;
43
44 }

派生类对象赋给基类对象合法,但派生类对象有、基类没有的数据成员(成员函数)在赋值过程中会丢失,即产生切割问题。

改为:


 1 void main()
2 {
3 people *pp1;
4 teacher *pt1;
5 pt1=new teacher;
6 pt1->name="lili";
7 pt1->age=31;
8 pt1->wage=4200;
9 pp1=pt1;
10 pt1->print();
11 cout<<endl<<endl;
12 pp1->print();
13
14 }

数据成员没有丢失,但必须注意必须使用虚函数访问。基类people将print()声明为virtual,,所以一旦编译器看到以下调用就会检查people和teacher的virtual表,判断pp1是指向pt1类型的对象:pp1->print(),因此就会使用以下函数代码:teacher::print(),而不会去使用people::print()
的代码

继承派生产生的切割问题,布布扣,bubuko.com

时间: 2024-10-05 23:50:17

继承派生产生的切割问题的相关文章

继承&派生

一.什么是继承和派生 封装.继承.多态是C++的三个重要的特性.在面向对象的技术中强调软件的可重用性,而继承机制就是用来解决软件的重用问题.在C++中,所谓"继承"就是在一个已经存在的类的基础上建立一个新的类.已经存在的类成为基类或父类,新建立的类称为派生类或子类. 一个类从一个已有的类那里获得已有的特性,这种现象称为类的继承.通过继承,一个新建的子类从父类那里获得父类的特性.从另一角度说,从已有的类(父类)产生一个新的类(子类),称为类的派生.派生类继承类基的所有数据成员和成员函数,

面向对象--多继承&amp;派生类对象内存布局分析&amp;各基类指针所指向的位置分析

背景 原文链接:ordeder  http://blog.csdn.net/ordeder/article/details/25477363 关于非虚函数的成员函数的调用机制,可以参考: http://blog.csdn.net/yuanyirui/article/details/4594805 成员函数的调用涉及到面向对象语言的反射机制. 虚函数表机制可以查看下面这个blog: http://blog.csdn.net/haoel/article/details/1948051 总结为: 其一

c++ 类的继承派生

作者:张煜 这周上的c++课上老师讲了类的继承和派生,总觉得他讲的相当的不完整. 类的继承是利用已有的类来建立专用类的编程技术.从另一个角度来说,从已有的类(父类)产生一个新的子类,称为类的派生. 继承是面向程序设计中最重要的机制,它支持层次分类的观点.继承使得程序员可以在一个较一般的类的基础上很快地建立一个新类,而不必从零开始设计每个类,在现实世界中,许多实体或概念不是孤立的,它们具有共同的特征,但也有细微的差别,人们使用层次分类的方法来描述这些实体或概念之间的相似点和不同点.如下图:    

【C++】继承派生中对象相互赋值情况

//继承派生中对象相互赋值情况 //派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的隐藏对象赋值给基类对象. //反过来不行,因为派生类的新成员无值可赋. #include <iostream> using namespace std; class B { public: B() { cout<<"B"<<endl; } void fun() { cout<<"B::fun()"<<

Python开发基础-Day18继承派生、组合、接口和抽象类

类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承object类的子类成为经典类(在python2中,没有继承object的类,以及它的子类,都是经典类) 1 class People: 2 pass 3 class Animal: 4 pass 5 class Student(People,Animal): #People.Animal称为基类或父类,

python基础之继承派生、组合、接口和抽象类

类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承object类的子类成为经典类(在python2中,没有继承object的类,以及它的子类,都是经典类) 1 class People: 2 pass 3 class Animal: 4 pass 5 class Student(People,Animal): #People.Animal称为基类或父类,

Python基础----继承派生、组合、接口和抽象类

类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承object类的子类成为经典类(在python2中,没有继承object的类,以及它的子类,都是经典类) 1 class People: 2 pass 3 class Animal: 4 pass 5 class Student(People,Animal): #People.Animal称为基类或父类,

继承,派生,组合

1 .继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 1 class People: 2 pass 3 class Animal: 4 pass 5 class Student(People,Animal):#people ,Animal 是父类(基类),Student是子类(派生类) 6 pass 7 print(Student.__bases__)#(<class '__main__.People'>, &

面向对象 继承 派生

函数体代码只在调用时执行 ,一但调用产生作用域,存放函数变量 对象:特征与技能的结合体  类:一系列对象相似特征与相似技能的结合体 类:相似特征与技能的结合体 类class 类名首字母大写,类在定义阶段内部代码就会执行,产生名称空间(类名.__dict__:各属性名值对的字典),内部定义的变量:数据属性 类内部定义的函数:函数属性 class.属性名来访问属性 class.新属性名 = '**'增加了一个属性 del class.属性名 删除属性   stu1.属性名=''更改一个属性 类名()