首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

新手为什么同一个程序中的虚函数,有一个不能运行

2012-02-15 
新手求助:为什么同一个程序中的虚函数,有一个不能运行?近日,在 Visual Studio .Net 2008 的 VC++ 上运行 D

新手求助:为什么同一个程序中的虚函数,有一个不能运行?
近日,在 Visual Studio .Net 2008 的 VC++ 上运行 Deitel 的《C++程序设计教程》中的一个例程( 图10.12-图10.20),却发生了错误,错误及程序如下,请各位指教,多谢!
==========================================================================================================================
错误1error C2084: 函数“double Cylinder::getArea(void) const”已有主体d:\backup\我的文档\visual studio 2008\projects\c++deitel10-20\c++deitel10-20\cylinder.cpp23C++deitel10-20
===========================================================================================================================
Shape.h
-------------------------------------------------
#ifndef SHAPE_H
#define SHAPE_H

#include <string>
using namespace std;

class Shape
{
public:
virtual double getArea() const;

virtual double getVolume() const;

virtual string getName() const = 0;
virtual void print() const = 0;
};

#endif

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Shape.cpp
----------------------------------------------------
#include <iostream>
using namespace std;

#include "shape.h"

double Shape::getArea() const
{
return 0.0;
}

double Shape::getVolume() const
{
return 0.0;
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Point.h
--------------------------------------------------
#ifndef POINT_H
#define POINT_H

#include "shape.h"

class Point : public Shape
{
public:
Point( int = 0, int = 0 );

void setX( int );
int getX() const;

void setY( int );
int getY() const;

virtual string getName() const;

virtual void print() const;

private:
int x;
int y;
};

#endif

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Point.cpp
-----------------------------------------------------
#include <iostream>
using namespace std;

#include "point.h"

Point::Point( int xValue, int yValue ) : x( xValue ), y( yValue )
{

}

void Point::setX( int xValue )
{
x = xValue;
}

int Point::getX() const
{
return x;


void Point::setY( int yValue )
{
y = yValue;
}

int Point::getY() const
{
return y;
}

string Point::getName() const
{
return "Point";
}

void Point::print() const
{
cout << "[ " << getX() << ", " << getY() << " ]";
}

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Circle.h
---------------------------------------------------
#ifndef CIRCLE_H
#define CIRCLE_H

#include "point.h"

class Circle : public Point
{
public:
Circle( int = 0, int = 0, double = 0.0 );

void setRadius( double );
double getRadius() const;

double getDiameter() const;
double getCircumference() const;
virtual double getArea() const;

virtual string getName() const;

virtual void print() const;

private:
double radius;
};

#endif

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Circle.cpp
-------------------------------------------------------
#include <iostream>
using namespace std;

#include "circle.h"

Circle::Circle( int xValue, int yValue, double radiusValue ) : Point( xValue, yValue )
{
setRadius( radiusValue );
}



void Circle::setRadius( double radiusValue )
{
radius = ( radiusValue < 0.0 ? 0.0 : radiusValue );
}

double Circle::getRadius() const
{
return radius;
}

double Circle::getDiameter() const
{
return 2 * getRadius();
}

double Circle::getCircumference() const
{
return 3.14159 * getRadius() * getRadius();
}

double Circle::getArea() const
{
return 3.14159 * getRadius() * getRadius();
}

string Circle::getName() const
{
return "Circle";
}

void Circle::print() const
{
cout << "center is ";
Point::print();
cout << "; radius is " << getRadius();
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Cylinder.h
--------------------------------------------------
#ifndef CYLINDER_H
#define CYLINDER_H

#include "circle.h"

class Cylinder : public Circle
{
public:
Cylinder( int = 0, int = 0, double = 0.0, double = 0.0 );

void setHeight( double );
double getHeight() const;

virtual double getArea() const;
virtual double getVolume() const;

virtual string getName() const;

virtual void print() const;

private:
double height;
};

#endif

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Cylinder.cpp
-----------------------------------------------------
#include <iostream>
using namespace std;

#include "cylinder.h"

Cylinder::Cylinder( int xValue, int yValue, double radiusValue , double heightValue ) 
  : Circle( xValue, yValue, radiusValue )
{
setHeight( heightValue );
}

void Cylinder::setHeight( double heightValue )
{
height = ( heightValue < 0.0 ? 0.0 : heightValue );
}

double Cylinder::getArea() const
{
return height;
}

double Cylinder::getArea() const
{
return 2 * Circle::getArea() + getCircumference() * getHeight();
}

double Cylinder::getVolume() const
{
return Circle::getArea() + getHeight();
}

string Cylinder::getName() const
{
return "Cylinder";
}

void Cylinder::print() const
{
Circle::print();
cout << "; height is " << getHeight();
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
main.cpp
--------------------
#include <iostream>
using namespace std;

#include <iomanip>
using namespace std;

#include <vector>
using namespace std;

#include "shape.h"
#include "point.h"
#include "circle.h"
#include "cylinder.h"

void virtualViaPointer( const Shape * );
void virtualViaReference( const Shape & );

int main()
{
cout << fixed << setprecision( 2 );

Point point( 7, 11 );
Circle circle( 22, 8, 3.5 );
Cylinder cylinder( 10, 10, 3.3, 10 );

cout << point.getName() << ": ";
point.print();
cout << '\n';

cout << circle.getName() << ": ";
circle.print();
cout << '\n';

cout << cylinder.getName() << ": ";
cylinder.print();
cout << "\n\n";

vector< Shape * > shapeVector( 3 );

shapeVector[ 0 ] = &point;

shapeVector[ 2 ] = &circle;

shapeVector[ 3 ] = &cylinder;

cout << "\nVirtual function calls made off "


<< "base-class pointer:\n\n";

for ( int i = 0; i < shapeVector.size(); i++ )
virtualViaPointer( shapeVector[ i ] );

cout << "\nVirtual function calls made off "
<< "base-class references:\n\n";

for ( int j = 0; j < shapeVector.size(); j++ )
virtualViaReference( * shapeVector[ j ] );

system( "pause" );

return 0;
}

void virtualViaPointer( const Shape * baseClassPtr )
{
cout << baseClassPtr->getName() << ": ";

baseClassPtr->print();

cout << "\narea is " << baseClassPtr->getArea()
<< "\nvolume is " << baseClassPtr->getVolume()
<< "\n\n";
}

void virtualViaReference( const Shape &baseClassRef )
{
cout << baseClassRef.getName() << ": ";

baseClassRef.print();

cout << "\narea is " << baseClassRef.getArea()
<< "\nvolume is " << baseClassRef.getVolume() << "\n\n";
}

















[解决办法]
你重复定义了

double Cylinder::getArea() const 

return height; 


double Cylinder::getArea() const 

return 2 * Circle::getArea() + getCircumference() * getHeight(); 
}

第一个应该是getHeight
[解决办法]
。up

热点排行