| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4318 人关注过本帖
标题:派生类的拷贝构造函数如何定义
只看楼主 加入收藏
heyyroup
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2006-6-14
收藏
 问题点数:0 回复次数:12 
派生类的拷贝构造函数如何定义
今天做一道c++的题目,是有关于派生类的动态内存分配的,但是在定义类的构造函数的发现没办法写了。
这个是我定义的类和派生类
#ifndef CLASSIC2_H_
#define CLASSIC2_H_
class Cd
{
private:
char *performers;
char *label;
int selections;
double playtime;
public:
Cd(const char *s1,const char *s2,int n,double x);
Cd(const Cd & d);
Cd();
~Cd();
virtual void Report()const;
Cd & operator=(const Cd & d);
};
class Classic :public Cd
{
private:
char *primarywork;
public:
Classic(const char *pw,const char *s1,const char *s2,int n,double x);
Classic();
Classic(const Classic & c);
Classic(const Cd & d);
Classic & operator=(const Classic & c);
void Report()const;
};
#endif
红色是我自己加的几个构造函数,但是我不知道如何定义了,派生类的数据成员char *performers;
char *label;
int selections;
double playtime如何赋值呢,又不能直接调用基类的成员变量。
搜索更多相关主题的帖子: 构造函数 派生类 定义 内存 const 
2007-09-13 17:12
heyyroup
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2006-6-14
收藏
得分:0 
没人指导一下吗?
2007-09-13 20:32
reedleaf
Rank: 2
等 级:新手上路
威 望:3
帖 子:62
专家分:0
注 册:2007-8-5
收藏
得分:0 
应该是基类的数据成员char *performers;
char *label;
int selections;
double playtime如何赋值吧。


2007-09-14 00:14
jbwang
Rank: 1
等 级:新手上路
帖 子:64
专家分:0
注 册:2007-5-22
收藏
得分:0 
想了半天也没有想出办法来。
我觉得这样构造函数不太会出现使用,像Classic(const Classic & c);
既然已经知道了Classic c,那么我们只要直接赋值就好了,何必用构造函数呢?
Classic b=c;

至于第二个构造函数就好象要把一个基类赋给一个子类,这是没法做到的。(只有子类能赋给基类Cd a=b;)

我觉得讨论这个问题的意义不大,大家各抒己见吧!
2007-09-14 00:49
reedleaf
Rank: 2
等 级:新手上路
威 望:3
帖 子:62
专家分:0
注 册:2007-8-5
收藏
得分:0 

个人理解: 仅供参考

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std;
#ifndef CLASSIC2_H_
#define CLASSIC2_H_
class Cd
{
private:
char *performers;
char *label;
int selections;
double playtime;
public:
Cd(const char *s1,const char *s2,int n,double x);
Cd(const Cd & d);
Cd();
~Cd(){};
virtual void Report()const{};
Cd & operator=(const Cd & d){};
};

Cd::Cd(const char *s1,const char *s2,int n,double x)
{
strcpy(performers,s1);
strcpy(label,s2);
selections=n;
playtime=x;
}

Cd::Cd(const Cd & d)
{
performers=d.performers;
label=d.label;
selections=d.selections;
playtime=d.selections;
}

Cd::Cd()
{
performers=NULL;
label=NULL;
selections=0;
playtime=0.0;

}

class Classic :public Cd
{
private:
char *primarywork;
public:
Classic(const char *pw,const char *s1,const char *s2,int n,double x);
Classic();
Classic(const Classic & c);
Classic(const Cd & d);
Classic & operator=(const Classic & c){};
void Report()const{};
};

Classic::Classic(const char *pw,const char *s1,const char *s2,int n,double x)
:Cd(s1,s2,n,x)
{
strcpy(primarywork,pw);
}

Classic::Classic()
{
primarywork=NULL;
}

Classic::Classic(const Classic & c)//只能调用父类默认构造函数
{
primarywork=c.primarywork;
}

Classic::Classic(const Cd & d):Cd(d)
{
primarywork=NULL;
}

#endif


int main(int argc, char* argv[])
{
return 0;
}


2007-09-14 00:52
jbwang
Rank: 1
等 级:新手上路
帖 子:64
专家分:0
注 册:2007-5-22
收藏
得分:0 

楼上的程序挺好的,在成员函数的定义中,类的对象可以访问类中私有成员
不知道我的理解是否正确???

2007-09-14 01:00
reedleaf
Rank: 2
等 级:新手上路
威 望:3
帖 子:62
专家分:0
注 册:2007-8-5
收藏
得分:0 
在成员函数中是可以访问自己的私有成员的

2007-09-14 01:04
jbwang
Rank: 1
等 级:新手上路
帖 子:64
专家分:0
注 册:2007-5-22
收藏
得分:0 
对于Classic c 这个Classic对象,无论在哪,c都不能访问基类Cd中的私有成员。
c可以在Classic成员函数中访问Classic的非继承私有成员,如:c.primarywork在程序中出现的。
但是c.primarywork在成员函数之外(类定义之外)的其他地方出现,就要报错了。

今天又学到东西了
2007-09-14 01:21
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
是啊,我也学到不少东西啊.私有成员只对函数开放,公有成员和保护成员才对对象开放.如果涉及到三种继承有的有要小心了.我是自学的,看来要多练习啊,要不真看不懂啊.

学习需要安静。。海盗要重新来过。。
2007-09-14 09:32
heyyroup
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2006-6-14
收藏
得分:0 

我的思路是这样的。我希望在派生类中直接实现对象之间的相互赋值。例如A,B都是Classic的对象。可以执行A(B),A=B操作。同时如果A是基类的对象,而B是派生类的对象的话。也可以执行B=A,只不过是派生类多出来的成员变量设为默认值。所以我才加了这些构造函数。但是在派生类的变量
char *label;
int selections;
double playtime
不知道如何赋值。编译的时候老是提示无法读取基类的private变量


不知道我的想法是不是正确。可不可能实现呢?

2007-09-14 17:20
快速回复:派生类的拷贝构造函数如何定义
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038740 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved