C++的继承关于向上类型转换

对于一个类比如马类来说可以分为很多比如千里马等等的对象,比如千里马有时候也可以作为一个类假如说是千里马类下的黑马,它是千里马的一个对象,所以它也是马,所以说它也是马的对象,这就是派生类的对象也是基类的对象,但是反过来不能说马是黑马的对象,所以计算机科学中所有都是在描述现实生活中的实物之间的关系(哈哈 我又感慨了一下)

下来看几个例子

enum note{middleC,Csharp,Cflat};

class Instrument
{
public:
	void play(note )const
	{
		cout<<"Instrument Play\n";
	}
};

class Wind:public Instrument
{
    void play(note )const
    {
            cout<<"Wind Play\n";
    }
 };
void tune(Instrument &i)
{
	i.play(middleC);
}

void main()
{
	Wind  flute;//Wind继承了Instrucment也是Instrument的对象
	tune (flute);//upcast 向上类型转换 这里转换之后就会认为是基类的对象当然只能调用基类的函数,要想实现还是调用派生类的还是就要使用虚函数概念

 }

有关虚函数可以看这篇文章

#include <iostream>
using namespace std;

class Parent
{
public:
	Parent(int ii=0):i(ii)
	{
		cout<<"Parent()\n";
	}
	Parent(const Parent& b):i(b.i)
	{
		cout<<"Copy Parent()\n";
	}
friend ostream& operator<<(ostream &os,const Parent&p)
{//除了赋值运算符,所有的重载运算符都能继承到派生类中
	return os<<"Parent::operator<<"<<p.i<<" ";
}
private:
	int i;

};

class Member
{
public:
    Member(int ii=0):i(ii)
	{
		cout<<"Member()\n";
	}

	Member(const Member& m):i(m.i)
	{
		cout<<"Copy Member()\n";
	}
friend ostream& operator<<(ostream &os,const Member& m)
{
	return os<<"Member:: Operator<<"<<m.i<<" ";
}
private:
	int i;
};

class child:public Parent
{
public:
	child(int ii=0):Parent(ii),i(ii),m(ii)
	{
		cout<<"Child()\n";
	}
	child(const child&c):Parent(c),i(c.i),m(c.m)
	{//这里将child的对象赋给了parent的引用进行了向上的类型转换
		cout<<"Copy Child()\n";
	}
	friend ostream& operator<<(ostream& os,const child& c)
	{
		return os<<(Parent&)c<<c.m<<" child::operator<<"<<c.i;
	}
private:
	int i;
	Member m;
};

void main()
{
child c(2);
child c1 =c;//调用基类parent的拷贝构造函数和member的拷贝构造函数构造自己
cout<<c1<<endl;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-10 08:52:10

C++的继承关于向上类型转换的相关文章

C++中的向上类型转换和向下类型转换+四种强制类型转换

转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分别描述的是子类向基类,和基类向子类的强制类型转换. 向上强制类型转换 切割:覆盖方法和子类数据丢失的现象生成切割(slice) class Base { public: int b; virtual void Test() { cout << "base" <<en

C++中的向上类型转换和向下类型转换

在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分别描述的是子类向基类,和基类向子类的强制类型转换. 向上强制类型转换 切割:覆盖方法和子类数据丢失的现象生成切割(slice) [cpp] view plain copy class Base { public: int b; virtual void Test() { cout << "base" <<endl; } }; class Derived:public Base { public: in

muduo Dispatcher消息分发器 通过多态和模板进行向上类型转换

所谓消息分发(muduo 中,就是接收到buffer之后,额,或者说是 protobuf),在简单的程序设计里面的话,估计就是 type-switch 了,但是这样的话,肯定就不好扩展维护啦. 最后的方法就是,可以根据 type-name 自动去调用相应的方法. typedef boost::function<void (Message*)> ProtobufMessageCallback; 这个算是一个映射咯.muduo 中采用的是 map<Descriptor*,ProtobufMe

[015]向下类型转换和向上类型转换

1.定义 向下类型转换:从父类转换为子类 向上类型转换:从子类转换为父类 2.区别和危险性 1)一般来讲,向上类型转换都是安全的,例如: Base base; Device dev; base = dev;    ←向上数据转换 2)向下类型转换是危险的,因为子类可能存在一些父类其他不存在的个性(增加了成员变量和函数).例如: dev = base;    ←向下数据转换 更有可能产生切片问题,为了避免这种情况,我们可以使用dynamic_cast来继续进行向下类型转换. Device *dev

C++解析(25):关于动态内存分配、虚函数和继承中强制类型转换的疑问

0.目录 1.动态内存分配 1.1 new和malloc的区别 1.2 delete和free的区别 2.虚函数 2.1 构造函数与析构函数是否可以成为虚函数? 2.2 构造函数与析构函数是否可以发生多态? 3.继承中的强制类型转换 4.小结 1.动态内存分配 1.1 new和malloc的区别 new关键字与malloc函数的区别: new关键字是C++的一部分 malloc是由C库提供的函数 new以具体类型为单位进行内存分配 malloc以字节为单位进行内存分配 new在申请内存空间时可进

Java面向对象学习笔记 -- 3(继承、向上造型、重写)

1. 继承 1)extends关键字 ,使用继承可以实现代码的重用,在java语言中,需要通过extends关键字实现类的继承.继承完成后,子类(Sub class)可以继承父类(Super class)的成员变量及成员方法,同时子类也可以定义自己的成员变量和成员方法.届时,子类将具有父类的成员及本类的成员. 需要注意的是,Java语言不支持多重继承,即:一个类只能继承一个父类,但一个父类可以有多个子类. 2)使用继承的好处: ① 继承是在一些比较一般的类的基础上构造.建立和扩充新类的最有效的手

PA教材提纲 TAW12-1

Unit1 Introduction to Object-Oriented Programming(面向对象编程介绍) 1.1 Explaining the Object-Oriented Programming Model(解释面向对象编程) 编程语言发展史: 最早的语言是面向过程语言( procedural programming ): COBOL 差不多同时出现了面向对象( object-oriented programming )和面向逻辑与过程( logical and procedu

关于继承中的强制类型转换

dynamic_cast是与继承相关的类型转换关键字dynamic_cast要求相关的类中必须有虚函数用于直接或者间接继承关系的指针(引用)之间-指针: 转换成功:得到目标类型的指针 转换失败:得到一个空指针 -引用: 转换成功:得到目标类型的引用 转换失败:得到一个异常操作信息 编译器会检查dynamic_cast的使用是否正确类型转换的结果只可能在运行阶段才能得到 #include <iostream> #include <string> using namespace std

JAVA基础——面向对象三大特性:封装、继承、多态

JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据.     隐藏类的实例细节,方便修改和实现. 3.封装的实现步骤 需要注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作.当然最好使用get/set方法,比较标准. A.访问修饰符 从表格可以看出从上到下封装性越来越差. B.this关键字 1.this关键字代表当前