引用对象做向上转换,但对虚函数不影响使用


//: WIND2.CPP -- Inheritance & upcasting
#include <iostream.h>
enum note { middleC, Csharp, Cflat }; // Etc.

class instrument {
public:
void play(note) const { // 不是虚函数
cout << "instrument::play" << endl;
}
};

class wind : public instrument {
public:
void play(note) const {
cout << "wind::play" << endl;
}
};

void tune(instrument& i) { // 引用对象不会造成切片
i.play(middleC);
}

main() {
wind flute; // tune要求父类的引用对象,但这里定义的是子类对象
tune(flute); // 可以传递子类,但做了向上转换Upcasting,因为不是虚函数,所以调用父类函数。
}

运行结果:instrument::play


//: WIND3.CPP -- Late binding with virtual
#include <iostream.h>
enum note { middleC, Csharp, Cflat }; // Etc.

class instrument {
public:
virtual void play(note) const { // 虚函数
cout << "instrument::play" << endl;
}
};

// Wind objects are instruments
// because they have the same interface:
class wind : public instrument {
public:
// Redefine interface function:
void play(note) const {
cout << "wind::play" << endl;
}
};

void tune(instrument& i) {
// ...
i.play(middleC);
}

main() {
wind flute;
tune(flute); // 可以传递子类,但做了向上转换Upcasting,因为是虚函数,所以调用子类函数。
}

运行结果:wind::play


//: SLICE.CPP -- Object slicing
#include <iostream.h>

class base {
int i;
public:
base(int I = 0) : i(I) {}
virtual int sum() const { return i; }
};

class derived : public base {
int j;
public:
derived(int I = 0, int J = 0)
: base(I), j(J) {}
int sum() const { return base::sum() + j; }
};

void call(base b) {
cout << "sum = " << b.sum() << endl;
}

main() {
base b(10);
derived d(21, 47);
call(b);
call(d); // 产生切片以后,就算是调用虚函数也没有用,仍然使用父类的函数进行计算,计算的时候当然使用父类的数据成员
}

输出结果:

sum = 10
sum = 21

引用对象做向上转换,但对虚函数不影响使用,布布扣,bubuko.com

时间: 2024-10-21 00:42:32

引用对象做向上转换,但对虚函数不影响使用的相关文章

【足迹C++primer】52、转换和继承,虚函数

转换和继承,虚函数 Understanding conversions between base and derived classes is essential to understanding how object-oriented programming works in C++. 理解基类和派生类之间的转换是必不可少的 理解面向对象编程在. Like built-in pointers, the smart pointer classes (§12.1, p. 450) support

【足迹C++primer】52、,转换和继承虚函数

转换和继承,虚函数 Understanding conversions between base and derived classes is essential to understanding how object-oriented programming works in C++. 理解基类和派生类之间的转换是不可缺少的 理解面向对象编程在. Like built-in pointers, the smart pointer classes (§12.1, p. 450) support

【总结】关于C++虚函数、多态和对象切割

貌似很少有把这几件事连在一起讲的,在网上查了好久,也翻了半天书才弄明白整个过程是怎么回事. 先说现象再说原理: 1 // vtableTest.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 #include "iostream" 6 using namespace std; 7 8 class Base 9 { 10 public:

由剑指offer引发的思考——对象中虚函数指针的大小

先看一个简单的问题: 一.定义一个空的类型,对于其对象我们sizeof其大小,是1字节.因为我们定义一个类型,编译器必须为其分配空间,具体分配多少是编译器决定,vs是1字节,分配在栈区. 那,这一个字节会被初始化吗? 举个例子: #include<iostream> class parent{ }; int main() { parent my_par; int a = 0; std::cout << sizeof(my_par) << " "<

C++ Primer 学习笔记33_面向对象编程(4)--虚函数与多态(一):多态、派生类重定义、虚函数的访问、 . 和-&gt;的区别、虚析构函数、object slicing与虚函数

C++ Primer学习笔记33_面向对象编程(4)--虚函数与多态(一):多态.派生类重定义.虚函数的访问. . 和->的区别.虚析构函数.object slicing与虚函数 一.多态 多态可以简单地概括为"一个接口,多种方法",前面讲过的重载就是一种简单的多态,一个函数名(调用接口)对应着几个不同的函数原型(方法). 更通俗的说,多态行是指同一个操作作用于不同的对象就会产生不同的响应.或者说,多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为. 多态行分

读书笔记 effective c++ Item 35 考虑虚函数的替代者

1. 突破思维——不要将思维限定在面向对象方法上 你正在制作一个视频游戏,你正在为游戏中的人物设计一个类继承体系.你的游戏处在农耕时代,人类很容易受伤或者说健康度降低.因此你决定为其提供一个成员函数,healthValue,返回一个整型值来表明一个人物的健康度.因为不同的人物会用不同的方式来计算健康度,将healthValue声明为虚函数看上去是一个比较明显的设计方式: 1 class GameCharacter { 2 public: 3 4 virtual int healthValue()

C++:抽象基类和纯虚函数的理解

转载地址:http://blog.csdn.net/acs713/article/details/7352440 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ⑴抽象类的定义: 称带有纯虚函数的类为抽象类. ⑵抽象类的作用: 抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作.所以派生类实际上刻画了一组子类的操作接口的通用语义,这些语义也传给子类,子类可以具体实现这些

C++ 虚函数与纯虚函数 浅析

[摘要] 本文首先简述虚函数与纯虚函数的定义,然后分析比较两者的区别与联系(DWS). [正文] 1)虚函数与纯虚函数有什么区别? 虚函数,不代表函数为不被实现的函数,为了允许用基类的指针来调用子类的这个函数:允许被其子类重新定义的成员函数. 纯虚函数,才代表函数没有被实现,为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数. 2)虚就虚在所谓"推迟联编"或者"动态联编"上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的.

C++纯虚函数、虚函数、实函数、抽象类,重载、重写、重定义

首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象.继承.动态绑定.通过数据抽象,可以使类的接口与实现分离,使用继承,可以更容易地定义与其他类相似但不完全相同的新类,使用动态绑定,可以在一定程度上忽略相似类的区别,而以统一的方式使用它们的对象. 虚函数的作用是实现多态性(Polymorphism),多态性是将接口与实现进行分离,采用共同的方法,但因个体差异而采用不同的策略.纯虚函数则是一种特殊的虚函数.虚函数联系到多态,多态联系到继承. 一.虚函