社区
C语言
帖子详情
虚函数和继承问题?
billik
2002-06-27 05:53:31
base 类中含有虚函数
derived 为base的继承类
base a*= new derived [200];
derived::set(base* value)
{
a[0]=*value;
}
上面的语句是否正确?
其中调用的时候外面付给value的值的类型也是derived类型
怎样才能将外面传来的derived值保存下来?
...全文
45
14
打赏
收藏
虚函数和继承问题?
base 类中含有虚函数 derived 为base的继承类 base a*= new derived [200]; derived::set(base* value) { a[0]=*value; } 上面的语句是否正确? 其中调用的时候外面付给value的值的类型也是derived类型 怎样才能将外面传来的derived值保存下来?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
movingboy
2002-06-27
打赏
举报
回复
编译时就应该通不过。
carfieldQ_Q
2002-06-27
打赏
举报
回复
derived d;
derived2 d2;
d2.SetValue(d);
~~~~
最后一句为什么不会成功呢?
//////////
首先:编译通过没有?,这个程序里类之间的相互调用太多,太乱,我实在不知道能否编译通过(我指你的完整的程序)
如果编译通过了,最后一句执行却不成功我想可能有以下原因:
1.
class derived2
{
public:
derived2();
virtual setValue(base&a);
~~~~
};
derived d; 虽然derived是base的子类,可能也存在类型不匹配的问题。
2. 你的参数定义的是应用类型,那调用的时候最好用引用类型或者指针类型
改成 d2.SetValue(&d);试试看
:)
不知道能不能帮到你,也不知道自己说得对不:)
qxp
2002-06-27
打赏
举报
回复
吧你的全部的代码都贴出来吧,上面那个太乱了,
billik
2002-06-27
打赏
举报
回复
快呀,帮帮忙,我急坏了!!!!!
billik
2002-06-27
打赏
举报
回复
哪个的拷贝构造函数?
我已经在derived中写了呀
haidaya
2002-06-27
打赏
举报
回复
你的那个derived2中的values是个什么东西呀,属于undeclared identifier
SetValue()中的i也是,没有申明呀,
这句values[i] = value;什么意思?
我看不懂这段程序
casho
2002-06-27
打赏
举报
回复
要用到拷贝构造函数
billik
2002-06-27
打赏
举报
回复
比较急,请各位高手帮帮忙!
billik
2002-06-27
打赏
举报
回复
哪个的默认构造函数?
billik
2002-06-27
打赏
举报
回复
class base
{
public:
virtual int F1()=0;
};
class derived : public base
{
private:
int a;
public
virtual int F1();
};
class base2
{
public:
base* values;
public:
virtual setValue(base& a)=0;
};
class derived2
{
public:
derived2();
virtual setValue(base&a);
};
derived2::derived2()
{
values = new derived[200];
}
derived2::setValue(base& value)
{
values[i] = value;
}
以上是类的定义
调用:
derived d;
derived2 d2;
d2.SetValue(d);
最后一句为什么不会成功呢?
leasun
2002-06-27
打赏
举报
回复
可以,不过别忘了默认构造函数
andy_lau
2002-06-27
打赏
举报
回复
把整个类的代码贴出来,不明白你的意思。
Wargod2002
2002-06-27
打赏
举报
回复
不明白为什么要这样搞
billik
2002-06-27
打赏
举报
回复
急,帮帮忙!!!!
C++中构造函数和析构函数是否可以是
虚函数
,为什么?
构造函数和析构函数是否可以是
虚函数
,为什么? 1. 为什么构造函数不能为
虚函数
?
虚函数
的调用需要
虚函数
表指针,而该指针存放在对象的内容空间中;若构造函数声明为
虚函数
,那么由于对象还未创建,还没有内存空间,更没有
虚函数
表地址用来调用
虚函数
——构造函数了。 2. 为什么析构函数可以为
虚函数
,如果不设为
虚函数
可能会存在什么
问题
? 首先析构函数可以为
虚函数
,而且当要使用基类指针或引用调用子类时,最好将基类的析构函数声明为
虚函数
,否则可以存在内存泄露的
问题
。 举例说明: 子类B
继承
自基类A;A *p = new B
哪类析构函数必须是
虚函数
,为什么?为什么C++默认的析构函数不是
虚函数
?
将可能会被
继承
的父类的析构函数设置为
虚函数
,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。 C++默认的析构函数不是
虚函数
是因为
虚函数
需要额外的
虚函数
表和虚表指针,占用额外的内存。而对于不会被
继承
的类来说,其析构函数如果是
虚函数
,就会浪费内存。因此C++默认的析构函数不是
虚函数
,而是只有当需要当作父类时,设置为
虚函数
。 ...
构造函数和析构函数可以是
虚函数
吗?为什么?
三、构造函数和析构函数可以是
虚函数
吗?为什么? 1、构造函数 从存储空间角度,
虚函数
对应一个指向vtable
虚函数
表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。
问题
出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是
虚函数
。 从使用角度,
虚函数
主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用
虚函数
也没有实际意义呀。所以构造函数没有
构造函数或者析构函数中调用
虚函数
会怎么样?
简要结论: 1. 从语法上讲,调用完全没有
问题
。 2. 但是从效果上看,往往不能达到需要的目的。 Effective 的解释是: 派生类对象构造期间进入基类的构造函数时,对象类型变成了基类类型,而不是派生类类型。 同样,进入基类析构函数时,对象也是基类类型。 所以,
虚函数
始终仅仅调用基类的
虚函数
(如果是基类调用
虚函数
),不能达到多态的效果,所以放在构造函数中...
C++默认的析构函数不是
虚函数
?析构函数必须是
虚函数
?
虚析构函数:基类指针指向子类对象,用基类指针删除子类对象 纯虚析构函数:需要类内声明,类外实现,含之抽象类,不可实例化 C++默认的析构函数不是
虚函数
?析构函数必须是
虚函数
? C++默认的析构函数不是
虚函数
目的:节省内存
虚函数
需要额外的
虚函数
表和虚表指针,占用额外的内存。对于不会被
继承
的类来说,将析构设置成
虚函数
会浪费内存。只有需要当作父类时,设置成
虚函数
析构函数必须是
虚函数
:防止内存泄漏 当一个类作为父类,需要被
继承
,才把它的析构函数设置为
虚函数
, 子类有开辟到堆区的属性,父类指针走不到子类的析构函数
C语言
70,040
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章