社区
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值保存下来?
...全文
22
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
构造函数和析构函数可以是
虚函数
吗?为什么?
三、构造函数和析构函数可以是
虚函数
吗?为什么? 1、构造函数 从存储空间角度,
虚函数
对应一个指向vtable
虚函数
表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。
问题
出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是
虚函数
。 从使用角度,
虚函数
主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用
虚函数
也没有实际意义呀。所以构造函数没有
哪类析构函数必须是
虚函数
,为什么?为什么C++默认的析构函数不是
虚函数
?
将可能会被
继承
的父类的析构函数设置为
虚函数
,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。 C++默认的析构函数不是
虚函数
是因为
虚函数
需要额外的
虚函数
表和虚表指针,占用额外的内存。而对于不会被
继承
的类来说,其析构函数如果是
虚函数
,就会浪费内存。因此C++默认的析构函数不是
虚函数
,而是只有当需要当作父类时,设置为
虚函数
。 ...
一篇文章带你学懂C++
虚函数
表的
继承
问题
虚函数
表-
继承
单
继承
结论:当父类定义了
虚函数
时,在子类进行
继承
的时候会将父类的
虚函数
表也给
继承
下来所以那一些
虚函数
在子类中也是virtual类型的,如果要对父类中的
虚函数
进行重写时或添加
虚函数
,顺序是:(图表说明为图一) ①先将父类的
虚函数
列表复制过来(补充一点 ②重写
虚函数
时是把从父类
继承
过来的
虚函数
表中对应的
虚函数
进行相应的替换。 ③如果子类自己要添加自己的
虚函数
,则是把添加的
虚函数
加到从......
C++
虚函数
与
继承
百度百科关于
虚函数
的定义: 简单地说,那些被virtual关键字修饰的成员函数,就是
虚函数
。
虚函数
的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。 维基百科对于
虚函数
的定义: 在面向对象程序设计领域,C++、Object Pascal 等语言中有
虚函数
(英语:virtual function)或虚方法(英语:virtual method)的概念。这种函数或方法可以被子类
继承
和覆盖,
C语言
69,366
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章