c++-为什么这段代码中对象rectangle的各个成员函数输出的值是对的,而box的却都是错的

问题描述

为什么这段代码中对象rectangle的各个成员函数输出的值是对的,而box的却都是错的

#include
using namespace std;
class rectangle
{
protected:
double length,width,l,w;
public:
void setlength();
void getlength();
void setwidth();
void getwidth();
double area();
double perimeter();
double diagmonal();
};
void rectangle::setlength()
{
cout<<"please enter the length of rectangle(box):";
cin>>l;
}
void rectangle::getlength()
{
length=l;
}
void rectangle::setwidth()
{
cout<<"please enter the width of rectangle(box):";
cin>>w;
}
void rectangle::getwidth()
{
width=w;
}

double rectangle::area()
{
return(length*width);
}
double rectangle::perimeter()
{
return(2*(length+width));
}
double rectangle::diagmonal()
{
double x=length*length+width*width;
return(sqrt(x));
}
class box:protected rectangle
{
protected:
double height,h;
public:
void setheight();
void getheight();
double area();
double perimeter();
double diagmonal();
double volume();
};
void box::setheight()
{
cout<<"please enter the height for box:";
cin>>h;
}
void box::getheight()
{
height=h;
}
double box::area()
{
return(2*(length*width+length*height+width*height));
}
double box::perimeter()
{
return(4*(length+width+height));
}
double box::diagmonal()
{
return(sqrt(length*length+width*width+height*height));
}
double box::volume()
{
return((length*width)*height);
}
int main()
{
rectangle r;
box b;
r.setlength();
r.getlength();
r.setwidth();
r.getwidth();
b.setheight();
b.getheight();
cout<<"the box's volume is:"<<b.volume()<<endl;
}

解决方案

如果你非要用protected继承,那只能这样:

#include <iostream>
#include <math.h>
using namespace std;
class rectangle
{
protected:
  double length,width,l,w;
public:
  void setlength();
  void getlength();
  void setwidth();
  void getwidth();
  double area();
  double perimeter();
  double diagmonal();
};
void rectangle::setlength()
{
  cout<<"please enter the length of rectangle(box):";
  cin>>l;
}
void rectangle::getlength()
{
  length=l;
}
void rectangle::setwidth()
{
  cout<<"please enter the width of rectangle(box):";
  cin>>w;
}
void rectangle::getwidth()
{
  width=w;
}
double rectangle::area()
{
  return(length*width);
}
double rectangle::perimeter()
{
  return(2*(length+width));
}
double rectangle::diagmonal()
{
  double x=length*length+width*width;
  return(sqrt(x));
}
class box:protected rectangle
{
protected:
  double height,h;
public:
  void setheight();
  void getheight();
  double area();
  double perimeter();
  double diagmonal();
  double volume();
};
void box::setheight()
{
  cout<<"please enter the height for box:";
  cin>>h;
}
void box::getheight()
{
  height=h;
  cout << height << endl;
}
double box::area()
{
  return(2*(length*width+length*height+width*height));
}
double box::perimeter()
{
  return(4*(length+width+height));
}
double box::diagmonal()
{
  return(sqrt(length*length+width*width+height*height));
}
double box::volume()
{
  setlength();
  getlength();
  setwidth();
  getwidth();
  return((length*width)*height);
}
int main()
{
  box * p = new box;
  p->setheight();
  p->getheight();
  cout<<"the box's volume is:"<<p->volume()<<endl;
  delete p;
  p = NULL;
}

解决方案二:

既然是继承,派生类就不要再定义这些成员了。

解决方案三:

这个格式太惨了。

你的box型的brectangle型的r**实例化之后**之间没有关联。

你试试这样吧:

rectangle r;
box * p = (box*)&r;
r.setlength();
r.getlength();
r.setwidth();
r.getwidth();
p->setheight();
p->getheight();
cout<<"the box's volume is:"<<p->volume()<<endl;

解决方案四:

可能是数据类型不对,但是程序总的来看是没错的

解决方案五:

可能是数据类型不对,但是程序总的来看是没错的

解决方案六:

  1. class box:public rectangle 这里改为public继承
rectangle * r;
box * p = new box;
r = p;
r->setlength();
r->getlength();
r->setwidth();
r->getwidth();
p->setheight();
p->getheight();
cout<<"the box's volume is:"<<p->volume()<<endl;
delete p;
p = NULL;
时间: 2016-02-05

c++-为什么这段代码中对象rectangle的各个成员函数输出的值是对的,而box的却都是错的的相关文章

select-如何在action的一段代码中读出不同表单的内容,并一一对应?

问题描述 如何在action的一段代码中读出不同表单的内容,并一一对应? 比如说,我在action中,用一个pulbic String select(...)来写, 是不够在里面同时写上6个sql语句吗? 解决方案 用sql中的union,将6个select连起来 string sql = "(select xxx from xxx) union (select yyy from yyy) union(...)" 解决方案二: 楼上的语句是什么意思?求解释

指针-这段代码中的插入函数编译没有错误,运行就崩溃?其它函数都经过编译了没有错误?不知道是什么问题?

问题描述 这段代码中的插入函数编译没有错误,运行就崩溃?其它函数都经过编译了没有错误?不知道是什么问题? #include #include #include typedef struct POINT { int row; int col; struct POINT *next; }POINT; void initPointLink(POINT **pointLinkHeadPointer); void showPoints(POINT *pointLinkHead); void showOne

javascript-请问bstop在这段代码中的作用?以及“:&amp;amp;#39;+(iCur+iSpeed)+&amp;amp;#39;”中左右两个加号的意思?

问题描述 请问bstop在这段代码中的作用?以及":'+(iCur+iSpeed)+'"中左右两个加号的意思? function getStyle(obj, attr) { if(obj.currentStyle) { return obj.currentStyle[attr]; } else { return getComputedStyle(obj, false)[attr]; } } function startMove(obj, json, fn) { clearInterva

二维数组-请问这段代码中最后输出元素的时候,有必要加个空格吗?

问题描述 请问这段代码中最后输出元素的时候,有必要加个空格吗? static void Main(string[] args) { int[,] score = new int[3, 5]; score[0, 0] = 103; score[1,4] = 80; for (int i = 0; i <3; i++) { for (int j = 0; j < 5; j++) { Console.Write(score[i, j] + " "); Console.WriteL

注释-C++下面一段代码中的if的情况感觉不懂

问题描述 C++下面一段代码中的if的情况感觉不懂 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node{ int data; struct node *prior; struct node *next; } node;//双向链表结构体定义 int main() { node *num1,*num2,*sum; node *create(node *n); int

源代码-这段代码中的下划线,是什么意思?

问题描述 这段代码中的下划线,是什么意思? 这段代码中的下划线,是什么意思?>>呢? 解决方案 没有特殊意思,就是一个叫下划线的参数,这是lambda表达式,作为参数没有用到,所以随便写一个

androi-Drawable.mutate在这段代码中的含义是什么?

问题描述 Drawable.mutate在这段代码中的含义是什么? Drawable.mutate(); ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0); ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm); Drawable.setColorFilter(cf); 解决方案 参考:http://blog.csdn.net/dazme886/article/detai

java-这段代码中mcontext是什么意思,不太明白Context类?

问题描述 这段代码中mcontext是什么意思,不太明白Context类? mcontext在代码中有什么作用,不太懂Context类,求指教! 解决方案 1.它描述的是一个应用程序环境的信息,即上下文. 2.该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类. 3.通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent 信息 等.. 解决方案二: 直白点说Context指的就是你打开的一个

javascript-请问这段代码中的&amp;amp;quot; &amp;amp;quot; 的作用?

问题描述 请问这段代码中的" " 的作用? function hasclass(element, className) { classNamesList = element.className.split(" "); if (classNamesList.indexOf(className) === -1) { return false; } else { return true; } function addClass(element, newClassName)