为甚么无法实现多态
codeblocks吧
全部回复
仅看楼主
level 2
湯立輝 楼主
调了好久,为毛不能实现多态(这是C++ Primer Plus 第六版13章第一题),求大神解答我用的是codeblock16.01
//cd.h
#include <cstring>
class Cd
{
char performers[50];
char label[20];
int selection;
double playtime;
public:
Cd(char*,char*,int,double);
Cd(const Cd&);
Cd();
virtual ~Cd();
virtual void Report()const;
virtual void operator=(const Cd&);
char *perfor() {return performers;};
char *lab() { return label; };
int sel(){ return selection;};
double play(){ return playtime; };
void setPer(char *p){ strcpy(performers,p);};
void setlab(char *l){strcpy(label,l);};
void setsel(int num){selection=num;};
void setplay(double s){playtime=s;};
};
//cd.cpp
#include <iostream>
#include <cstring>
#include "cd.h"
Cd::Cd(char* s1,char* s2,int n,double x):selection(n),playtime(x)
{
strncpy(performers,s1,49);
strncpy(label,s2,19);
}
Cd::Cd(const Cd& d)
{
strcpy(performers,d.performers);
strcpy(label,d.label);
selection=d.selection;
playtime=d.playtime;
}
Cd::Cd()
{
performers[0]='\0';
label[0]='\0';
selection=0;
playtime=0.0;
}
Cd::~Cd(){}
void Cd::Report()const
{
std::cout<<"Performers: "<<performers<<"\tLabel: "<<label
<<"\tSelection: "<<selection<<"\tPlaytime"<<playtime<<std::endl;
}
void Cd::operator=(const Cd& d)
{
strcpy(performers,d.performers);
strcpy(label,d.label);
selection=d.selection;
playtime=d.playtime;
}
//classic.h
#include "cd.h"
class Classic:public Cd
{
char article[100];
public:
Classic(char*,char*,char*,int,double);
Classic();
Classic(Classic&);
virtual ~Classic();
virtual void Report();
virtual void operator=(Classic&);
};
//classic.cpp
#include <iostream>
#include <cstring>
#include "classic.h"
Classic::Classic(char* s1,char* s2,char* s3,int n,double x):Cd(s2,s3,n,x)
{
strcpy(article,s1);
}
Classic::Classic():Cd()
{
article[0]='\0';
}
Classic::Classic(Classic& c):Cd(c.perfor(),c.lab(),c.sel(),c.play())
{
strcpy(article,c.article);
}
Classic::~Classic() {}
void Classic::Report()
{
std::cout<<"Article: "<<article<<std::endl;
Cd::Report();
}
void Classic::operator=(Classic& c)
{
Cd::setPer(c.perfor());
Cd::setlab(c.lab());
Cd::setplay(c.play());
Cd::setsel(c.sel());
strcpy(article,c.article);
}
//main.cpp
#include <iostream>
#include "classic.h"
using namespace std;
void Bravo(const Cd&);
int main()
{
Cd c1("Beatles","Capitol",14,35.5);
Classic* x=new Classic("Piano Sonata in B flat, Fantasia in C",
"Alfred Brendel","Philips",2, 57.17);
Classic c2=*x;
Cd *pcd=&c1;
cout<<"Using object directly:\n";
c1.Report();
c2.Report();
cout<<"\nUsing type cd* pointer to objects:\n";
pcd->Report();
pcd=&c2;
pcd->Report();
cout<<"\nCalling a function with a Cd reference argument:\n";
Bravo(c1);
Bravo(c2);
cout<<"\nTesting assignment:\n";
Classic copy;
copy=c2;
copy.Report();
delete x;
return 0;
}
void Bravo(const Cd& disk)
{
disk.Report();
}
2016年05月09日 13点05分 1
level 2
湯立輝 楼主
已解决,Report方法少了一个const
2016年05月10日 02点05分 2
1