| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 493 人关注过本帖
标题:虚函数问题
只看楼主 加入收藏
虫虫飞ya飞
Rank: 1
等 级:新手上路
帖 子:122
专家分:0
注 册:2005-11-28
收藏
 问题点数:0 回复次数:7 
虚函数问题

#include<iostream>
using namespace std;
class Sale{
public:
Sale();
Sale(double the_price);
virtual double bill() const;
double savings(const Sale& other) const;

protected:
double price;
};
bool operator < (const Sale& first,const Sale& second);
Sale::Sale():price(0){}
Sale::Sale(double the_price):price(the_price){}
double Sale::bill() const
{
return price;
}
double Sale::savings(const Sale& other) const
{
return (bill()-other.bill());
}
bool operator < (const Sale& first,const Sale& second)
{
return (first.bill()<second.bill());
}
class DiscountSale:public Sale
{
public:
DiscountSale();
DiscountSale(double the_price,double the_discount);
virtual double bill() const;
protected:
double discount;
};
DiscountSale::DiscountSale():Sale(),discount(0)
{}
DiscountSale::DiscountSale(double the_price,double the_discount):Sale(the_price),discount(the_discount){};
double DiscountSale::bill() const{
double fraction=discount/100;
return (1-fraction)*price;
}
int main(){
Sale simple(10.00);
DiscountSale discount(11.00,10);
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
if(discount<simple){
cout<<"Discounted item is cheaper.\n";
cout<<"Savings is $"<<simple.savings(discount)<<endl;
}
else
cout<<"Discounted item is not cheaper.\n";
return 0;
}

为什么去了virtual之后输出的会是cout<<"Discounted item is not cheaper.\n";


搜索更多相关主题的帖子: 函数 
2006-07-13 14:20
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

关键在于<比较的时候,不同对象调用了不同的bill();(有virtual时)
那么由于Sale simple(10.00);DiscountSale discount(11.00,10);
(1-0.1)*11<10很明显成立。
而没有virtual时,他将会全部调用Sale中的bill();不信你可以跟踪试下


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-13 16:26
虫虫飞ya飞
Rank: 1
等 级:新手上路
帖 子:122
专家分:0
注 册:2005-11-28
收藏
得分:0 
没有虚函数的话bill()在派生类中就相当于重定义,是否如果没明确指出调用哪个函数,一般都是调用基类的同名函数呢??????顺便再问一下如何进行跟踪呢??

2006-07-13 16:46
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

没有虚函数的话bill()在派生类中就相当于重定义,是否如果没明确指出调用哪个函数,一般都是调用基类的同名函数呢??????

不是。只是你在 < 比较时,用了类型转换。
如果直接用该对象调用函数,就只会调用该对象的成员函数。

跟踪:
你用的VC6的话,可以看看孙鑫的视频:http://www.enet.com.cn/eschool/zhuanti/vc++/

他不仅教你知识,还教你用VC


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-13 17:33
虫虫飞ya飞
Rank: 1
等 级:新手上路
帖 子:122
专家分:0
注 册:2005-11-28
收藏
得分:0 
仍然不解中。。。。。。。。。。。。。

2006-07-14 09:35
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

这样说吧,你应该知道所有的成员函数调用,都是指针来指挥的。
由于是虚拟函数,所以调用该函数就不是只用this指针,而是用编译器生成的虚拟指针调用该函数。那么不管类型转换于否,都会根据他的虚拟指针来确定调用哪个函数
然而,如果非虚拟函数,那么调用的成员函数就是靠的this指针,通过类型转换,discountSale的this自然而然也“变”成了Sale的this。因为要知道,一个类的派生类,他实际就是在原有基础上做了额外的增加。(实际上可以看作他们是一个包含关系,当然首地址都是一样的)。可以看这个帖子的图形做理解:
http://www.bc-cn.net/bbs/dispbbs.asp?boardID=56&ID=77488&page=1


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-14 10:34
虫虫飞ya飞
Rank: 1
等 级:新手上路
帖 子:122
专家分:0
注 册:2005-11-28
收藏
得分:0 

有点头绪了,我在对这程序想想3Q


2006-07-14 12:58
chengenius
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2006-5-23
收藏
得分:0 


看看

2006-07-14 15:29
快速回复:虚函数问题
数据加载中...
 
   



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

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