标题:求高手解释动态绑定
取消只看楼主
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
结帖率:100%
已结贴  问题点数:20 回复次数:7 
求高手解释动态绑定
Sales_item():ptr(0),use(new size_t(1)){}
  Sales_item(Item_base& item):
  ptr(item.clone()),use(new size_t(1)){}
  Sales_item(const Sales_item& book):
  ptr(book.ptr),use(book.use){ ++*use;}
这是Sales_item类,Item_base是基类,Bulk_item是继承Item_base的类
在这里有个一构造函数
Sales_item(Item_base& item):
  ptr(item.clone()),use(new size_t(1)){}
我在主函数中使用
Sales_item item1(Bulk_item("7-115-14554-7",99,1,0.2));
  Sales_item item2(Item_base("7-115-14554-8",39));
提示错误
no matching function for call to `Sales_item::Sales_item(Bulk_item)'  
 candidates are: Sales_item::Sales_item(const Sales_item&)  
 Sales_item::Sales_item(Item_base&)  
Sales_item::Sales_item()  
no matching function for call to `Sales_item::Sales_item(Item_base)'  
candidates are: Sales_item::Sales_item(const Sales_item&)  
 Sales_item::Sales_item(Item_base&)  
Sales_item::Sales_item()  
为什么会提示没有匹配函数呢,但是如果我把
Sales_item(Item_base& item):
  ptr(item.clone()),use(new size_t(1)){}
改为
Sales_item(const Item_base& item):
  ptr(item.clone()),use(new size_t(1)){}
就运行正常,好像并不要求动态绑定时要用const Item_base& item吧,求高手解释下
搜索更多相关主题的帖子: function 
2011-04-24 23:14
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
得分:0 
回复 3楼 pangding
我写了一个测试的程序,还是出现了同样的问题,我还是不明白,为什么这样就不能动态绑定,const不是只不过是说明了他不能改变对象而已吗
2011-04-25 22:34
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
得分:0 
回复 3楼 pangding
我知道编译器把它当做了基类的引用,需要传递基类对象的引用才不会提示错误,但是,动态绑定的条件不是必须是基类的引用或指针吗,按书上所说,因为是引用,所以可在运行时确定实际类型,还是搞不懂。知道错,却不理解。
2011-04-25 22:39
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
得分:0 
回复 6楼 玩出来的代码
头文件
#include <iostream>
#include <string>
using namespace std;
class Base{
public:
       Base(int j=0):i(j){cout<<"bound Base"<<endl;}
       virtual void print(ostream &os)
       { cout<<i<<endl;}
protected:
        int i;
};
class Drived:public Base{
public:
       Drived(int ix,const string& sx=""):Base(ix),s(sx)
       {cout<<"bound Drived"<<endl;};
       void print(ostream& os)
       { cout<<i<<" "<<s<<endl;}
private:
        string s;
};
class Test{
public:
       Test(const Base& bas):base(bas){}
       void  Tprint()
       { base.print(cout);}
private:
        Base base;
};
主函数
#include <iostream>
#include "Base.h"
#include <string>
int main()
{
    Test test1(new Base(1));
    Test test2(new Drived(2,string("abcd")));
    test1.Tprint();
    test2.Tprint();
    system("PAUSE");
    return EXIT_SUCCESS;
}
又试了下,发现test2.Tprint();只输出基类部分,为什么呢,我更搞不懂了。
2011-04-26 07:16
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
得分:0 
回复 8楼 玩出来的代码
确实是乱得糊涂的,我知道那测试代码很有问题,也知道最先那个问题根本不涉及什么动态绑定,乱说一通了。但是你说这是对于临时对象的引用问题。于是我试了下,Sales_item(Item_base& item):
  ptr(item.clone()),use(new size_t(1)){} 这里还是这样,但主函数改为这样Bulk_item bulk("7-115-14554-7",99,1,0.2);  Sales_item item1(bulk);这是没有问题的,但这样是有问题的Sales_item item1(Bulk_item("7-115-14554-7",99,1,0.2)); 但我还是想不通,虽然是建立了一个临时对象,但是在调用clone函数Bulk_item* clone() const   { return new Bulk_item(*this);} ,函数结束之前,临时对象Bulk_item("7-115-14554-7",99,1,0.2)) 应该是还没有析构的,这样也就是说已经成功完成了ptr(item.clone())的初始化了,因为clone函数返回临时对象的副本,所以应该是没问题的。另一个问题是提示错误有no matching function for call to `Sales_item::Sales_item(Bulk_item) 这说明编译器已经知道我是传递了一个Bulk_item对象了,那我用Bulk_item对象去传给Sales_item(Item_base& item): ptr(item.clone()),use(new size_t(1)){}函数时,应该实参和形参是匹配的啊,为什么他还提示
candidates are: Sales_item::Sales_item(Item_base&)  说不匹配呢,不知道我的理解那里有错误,麻烦指正一下。
2011-04-26 13:56
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
得分:0 
回复 9楼 pangding
不好意思,确实乱套了。
2011-04-26 13:56
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
得分:0 
回复 8楼 玩出来的代码
而为什么用Sales_item(const Item_base& item):ptr(item.clone()),use(new size_t(1))就不会出现问题呢,这也是我头疼的地方
2011-04-26 13:59
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
得分:0 
回复 13楼 玩出来的代码
原来是这样啊,搞了这么久,终于是明白了,万分感谢。
2011-04-26 21:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-337799-1-1.html




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

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