C++ dynamic_cast对指针类型的转换

C8-3 三角形还是长方形?

(100.0/100 points)

题目描述

在多态概念中,基类的指针既可以指向基类的对象,又可以指向派生类的对象。我们可以使用dynamic_cast类型转换操作符来判断当前指针(必须是多态类型)是否能够转换成为某个目的类型的指针。

同学们先查找dynamic_cast的使用说明(如http://en.wikipedia.org/wiki/Run-time_type_information#dynamic_cast),然后使用该类型转换操作符完成下面程序(该题无输入)。

函数int getVertexCount(Shape * b)计算b的顶点数目,若b指向Shape类型,返回值为0;若b指向Triangle类型,返回值为3;若b指向Rectangle类型,返回值为4。


 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5
 6 class Shape{
 7 public:
 8     Shape() {}
 9     virtual ~Shape() {}
10 };
11
12 class Triangle : public Shape{
13 public:
14     Triangle() {}
15     ~Triangle() {}
16 };
17
18 class Rectangle : public Shape {
19 public:
20     Rectangle() {}
21     ~Rectangle() {}
22 };
23
24 /*用dynamic_cast类型转换操作符完成该函数*/
25 int getVertexCount(Shape * b){
26     Rectangle* rectangle = dynamic_cast<Rectangle*>(b);
27     if (rectangle != nullptr)
28         return 4;
29     Triangle* triangle = dynamic_cast<Triangle*>(b);
30     if (triangle != nullptr)
31         return 3;
32     return 0;
33 }
34
35 int main() {
36     Shape s;
37     cout << getVertexCount(&s) << endl;
38     Triangle t;
39     cout << getVertexCount(&t) << endl;
40     Rectangle r;
41     cout << getVertexCount(&r) << endl;
42 }

查阅Wikipedia,对照例子不难AC。

时间: 2024-10-15 04:27:29

C++ dynamic_cast对指针类型的转换的相关文章

指针类型强制转换

问题为下: #include<iostream.h> void main(){ int k=1; int *f=&k; *(float*)(f)=1; cout<<*f; }//输出为啥不是1呢 这个时候,我们能够看到函数式里面有格式的转换.假设格式转换时存在除void格式外,还有两个及两个以上的格式的转换,则这时候的指针所指的variable所占的内存会产生变化,从而会使格式发生对应的变化 对于本题: 当你强行将int指针变为float指针后 去到的数据实际已经超出了in

C++类型强制转换&lt;转&gt;

转载:http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a.C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast,字面上理解就是去const属性.static_cast,命名上理解是静态类型转换.如int转换成char.dynamic_cast,命名上理解是动态类型转换.如子

void及void指针类型

1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并 详述void及void指针类型的使用方法与技巧. 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据. void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义: void a; 这行语句编译时会出错,提示“illegal use of ty

c++第十四章-(类型强转换)

类型强转换有2种. class Company { public: Company(std::string theName,std::string theProduct); virtual void printInfo(); protected: std::string name; std::string product; }; Company::Company(std::string theName,std::string theProduct) { this->name = theName;

id 与void *类型的转换(转)

在ARC 无效时,像以下代码这样将id 变量强制转换void * 变量并不会出问题./* ARC 无效 */id obj = [[NSObject alloc] init];void *p = obj; 更进一步,将该void * 变量赋值给id 变量中,调用其实例方法,运行时也不会有问题./* ARC 无效 */id o = p;[o release]; 但是在ARC 有效时这便会引起编译错误.error: implicit conversion of an Objective-C point

Delphi Byte数组与String类型的转换

string string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节: 变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起始于@Str[1],@Str[1]偏移负16个字节的空间存储着字串长度.引用计数等信息.字符序列以NULL结束. string[n] string[n] = ShortString = 短字符串,最多容纳255个字符,实际长度是字符长度+1,是Delphi的简单类型: Str[0]存储着字符的个数,

学习小记:JS判断时特殊值与boolean类型的转换

扒开JQuery以及其他一些JS框架源码,常常能看到下面这样的判断, 写惯了C#高级语言语法的我,一直以来没能系统的理解透这段代码. var test; //do something... if(test){ //do something... } 此处就系统的记录一下这个JS特殊值与boolean类型的转换,测试代码与结果如下 window.onload = function () { var minusNum = -1; var zero = 0; var one = 1; var stri

06深入理解C指针之---指针类型和长度

该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 如果考虑到程序的可移植性和跨平台性时,指针长度就是一个问题,需要慎重处理.一般情况下,数据指针的长度时一样的,与指针类型无关,void型指针.char型指针.结构体指针等统统是一样的,函数指针的长度一般与数据指针长度不同.指针长度与CPU有关,严格意义上说与OS究竟是32位还是64位有关,同时不同的编译器分配内存时,长度也是不一样的.与指针相关的四种预定义类型如下: 一.size_t:用于安全

C# 指针学习笔记之指针类型

大学的时候学过C++.C,最近工作也不是很忙,就想起看看C#中的指针,看看.回忆一下啊,指针的用法,以下学习笔记摘自msdn:指针类型 在不安全的上下文中,类型可以是指针类型以及值类型或引用类型.指针类型声明具有下列形式之一: type* identifier; void* identifier; //allowed but not recommended 下列类型都可以是指针类型: sbyte.byte.short.ushort.int.uint.long.ulong.char.float.d