用基类指针去给子类的数据传参要怎么弄?

lingling1989r 2009-01-30 09:56:18

class base
{
enum tp{..};
..};
class device1:public base
{
int a;
..
};
class device2:public base
{
char b;
...
};

我用的是base的指针去New,因为外面传过来的参数不同,这个类中要存的内容不同,所以就派生出来了几个子类,所以就用了base指针,可是怎么将这些数据传递给子类的这些成员数据呢?
...全文
156 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
uwinb 2009-02-13
  • 打赏
  • 举报
回复
class base
{
enum tp{..};
..};
class device1:public base
{
int a;
public device1(int _a):a(_a){}
..
};
class device2:public base
{
char b;
public device2(char _b):b(_b){}
...
};

base *p1 = new device1(8);
base *p2 = new device2('+');
matrixdwy 2009-01-31
  • 打赏
  • 举报
回复
不是这样的,是我写错了。。。。。
lingling1989r 2009-01-31
  • 打赏
  • 举报
回复
回复楼上的:
原来
void putmember(int a)=0;void putmember(Param p) { m = p.i; }
还可以这样覆盖的。学习了。
lingling1989r 2009-01-31
  • 打赏
  • 举报
回复
这边g++编译也通过啦?
FoxOnWeb 2009-01-30
  • 打赏
  • 举报
回复
建立一个classFact类,
里面建一个getInstance static function,接受一个参数产生相应的子类返回。

base *p = new classFact::getInstance('a');
FoxOnWeb 2009-01-30
  • 打赏
  • 举报
回复
建立一个classFact类,
里面建一个getInstance static function,接受一个参数产生相应的子类返回。

base *p = new classFact::getInstance('a');
FoxOnWeb 2009-01-30
  • 打赏
  • 举报
回复
建立一个classFact类,
里面建一个getInstance static function,接受一个参数产生相应的子类返回。

base *p = new classFact.getInstance('a');
lingling1989r 2009-01-30
  • 打赏
  • 举报
回复
是这样的,要写一个表达式树,表达式派生出来有 运算符,有数字,有标识符,
这样要给我给他们传递值的时候要怎么做?
xiaoyisnail 2009-01-30
  • 打赏
  • 举报
回复
从设计上来讲,强制类型转换不好,如果代码中出现父类到子类的强制类型转换就说明设计上存在一定的问题,不知道楼主的需求的具体上下文是怎么样的
waizqfor 2009-01-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arong1234 的回复:]
基类不可能知道子类信息,因此解决这个问题的方法只有下面两种中的一种
1. 基类定义一个纯虚函数,派生类都必须实现,这个纯虚函数可以传参数给子类
2. 把基类指针强制转换为对应的基类类型指针,用那个指针设置
[/Quote]
UP
其实还用强制转换 来的比较快
base *m = new device2;
(device2 *)m -> b = 'a';
ljmscsq 2009-01-30
  • 打赏
  • 举报
回复

base *p=new device1;
((device1*) p)->a=1;
arong1234 2009-01-30
  • 打赏
  • 举报
回复
基类不可能知道子类信息,因此解决这个问题的方法只有下面两种中的一种
1. 基类定义一个纯虚函数,派生类都必须实现,这个纯虚函数可以传参数给子类
2. 把基类指针强制转换为对应的基类类型指针,用那个指针设置

matrixdwy 2009-01-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lingling1989r 的回复:]
参数类型不同,是不是要把这些不同参数类型对应到派生类的函数都在基类中写上,像12楼那样代码去实现啊???
[/Quote]
如果某一个虚函数有很多重载的话,12楼这样写是没有问题的,不过这样的确很麻烦
我想到一个方法可以化简这个问题,用union类型,大家参考参考

union Param {
int i;
char c;
float f;
double d;
....
};

class Base {
public:
void putmember(int a)=0;
void putmember(char b)=0;
};

class Derived1 : public Base {
int m;
public:
void putmember(Param p) { m = p.i; }
};

class Derived2 : public Base {
char m;
public:
int m;
void putmember(Param p){ m = p.c; }
};


arong1234 2009-01-30
  • 打赏
  • 举报
回复
在基类中实现一切太挫了。如果真这么复杂,索性连它内含什么类型数据也隐藏起来,然后由运算符自己去解释

例如,你可能有double型值,也可能有boolean类型值,则我们定义一个啥都不定义的基类

class CBase
{//这个类只用于实现单根,不包含任何具体实现

};


然后对于每种可能的值类型实现一个派生类

class CDouble: public CBase
{
double m_dValue;
protected:
CDouble(){};
public:
CDouble(double d):m_dValue(d){};
virtual double Calculate(){return m_dValue;};
};

class CBoolean: public CBase
{
bool m_bValue;
protected:
CBoolean(){};
public:
CBoolean(bool b):m_bValue(b){};
virtual bool Calculate(){return m_bValue;};
};


运算符节点派生于CDouble和CBoolean,而这些运算符自己有能力去检测它的操作数到底什么类型。

arong1234 2009-01-30
  • 打赏
  • 举报
回复
表达式元素能有多少种不同类型?不要那么复杂吧?
[Quote=引用 14 楼 lingling1989r 的回复:]
参数类型不同,是不是要把这些不同参数类型对应到派生类的函数都在基类中写上,像12楼那样代码去实现啊???
[/Quote]
lingling1989r 2009-01-30
  • 打赏
  • 举报
回复
参数类型不同,是不是要把这些不同参数类型对应到派生类的函数都在基类中写上,像12楼那样代码去实现啊???
biweilun 2009-01-30
  • 打赏
  • 举报
回复
Base* b = new Device1();
b->setDataMember(参数);
lingling1989r 2009-01-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 matrixdwy 的回复:]
在基类里弄一个虚函数名字就叫
virtual void setDataMember(参数) { }
在每个子类中根据需要重写这个函数

以后你就这样用
Base* b = new Device1();
b->setDataMember(参数);

这样不就用基类的接口实现了对派生类数据成员的访问了嘛
[/Quote]

就是说,我有几个派生类,就要在基类里写几个能够传递相应参数的纯虚函数么?可是,如果有没有实现的纯虚函数的派生类不是还是虚类,不能去实例化对象么?要那样的话,怎么办,像下面的那样对吗?

class base
{
void putmember(int a)=0;
void putmember(char b)=0;
....
};
class device1:public base
{
int m;
void putmember(int a){m=a;}
void putmember(char b){}//不用纯虚函数
..
};
class devicee:public base
{
char n;
void putmember(int a){}
void putmember(char b){n=b;}
....
};


这样可以么??
arong1234 2009-01-30
  • 打赏
  • 举报
回复
我曾经设想的设计
1. 定义一个CExpression基类,定义虚函数Calculate和double值。如果不是运算符,则该类直接返回这个double值,表示
scalar.


class CExpression
{
double m_value;
protected:
CExpression(){};//保留给派生类使用
public:
CExpression(double value):m_value(value){};
virtual double Calculate(){return m_value;};
};


2. 运算符是派生自CExpression的叶子类,它实现Calculate,同时增加2个孩子,分别对应操作数

typedef enum {
OP_ADD = 0,
OP_SUB = 1,
OP_MUL = 2,
OP_DIV = 3,
OP_NEG = 4,
...//你可以自己增加自己运算符
}OPERATORS;
class COperator :public CExpression
{
private:
CExpression * m_pLeft, * m_pRight;
OPERATORS m_op;
public:
//最多两个参数,如果是单目运算符,则right = NULL
COperator( OPERATORS op, CExpression * left, CExpression* right=NULL);
//根据m_op计算并返回值
double Calculate();
};

这样,使用这两个类,就可以构建一个完整的表达式树
arong1234 2009-01-30
  • 打赏
  • 举报
回复
这些值应该在构建好对象之后就不变了吧?那么让他们的构造函数完成赋值即可

[Quote=引用 5 楼 lingling1989r 的回复:]
是这样的,要写一个表达式树,表达式派生出来有 运算符,有数字,有标识符,
这样要给我给他们传递值的时候要怎么做?
[/Quote]
加载更多回复(1)

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧