社区
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值保存下来?
...全文
25
14
打赏
收藏
虚函数和继承问题?
base 类中含有虚函数 derived 为base的继承类 base a*= new derived [200]; derived::set(base* value) { a[0]=*value; } 上面的语句是否正确? 其中调用的时候外面付给value的值的类型也是derived类型 怎样才能将外面传来的derived值保存下来?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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呢?所以构造函数不能是
虚函数
。 从使用角度,
虚函数
主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用
虚函数
也没有实际意义呀。所以构造函数没有
一篇文章带你学懂C++
虚函数
表的
继承
问题
虚函数
表-
继承
单
继承
结论:当父类定义了
虚函数
时,在子类进行
继承
的时候会将父类的
虚函数
表也给
继承
下来所以那一些
虚函数
在子类中也是virtual类型的,如果要对父类中的
虚函数
进行重写时或添加
虚函数
,顺序是:(图表说明为图一) ①先将父类的
虚函数
列表复制过来(补充一点 ②重写
虚函数
时是把从父类
继承
过来的
虚函数
表中对应的
虚函数
进行相应的替换。 ③如果子类自己要添加自己的
虚函数
,则是把添加的
虚函数
加到从......
构造函数或者析构函数中调用
虚函数
会怎么样?
简要结论: 1. 从语法上讲,调用完全没有
问题
。 2. 但是从效果上看,往往不能达到需要的目的。 Effective 的解释是: 派生类对象构造期间进入基类的构造函数时,对象类型变成了基类类型,而不是派生类类型。 同样,进入基类析构函数时,对象也是基类类型。 所以,
虚函数
始终仅仅调用基类的
虚函数
(如果是基类调用
虚函数
),不能达到多态的效果,所以放在构造函数中...
C语言
70,020
社区成员
243,264
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章