您的位置:首页 > 编程语言 > C语言/C++

C++学习基础十一——子类对象向父类对象的转化

2016-09-21 23:12 453 查看
一、C++中可以实现子类向父类的转换,主要分为三种形式:

1.对象转换:不能实现动态绑定,即不能实现多态。

2.引用转换:动态绑定,实现多态。

3.指针转换:动态绑定,实现多态。

注意:一般不会出现父类转化为子类的情况。

二、代码片段如下:

#include <iostream>
#include <string>

using namespace std;

class Item_base
{
public:
Item_base(const string &is,double p):isbn(is),price(p){}
string book()
{
return isbn;
}
virtual double calMoney(int c)
{
return c * price;
}
private:
string isbn;
protected:
double price;
};

class Bulk_item : public Item_base
{
public:
Bulk_item::Bulk_item(const string &is,double p,int c,double dis):
Item_base(is,p),min_py(c),discocunt(dis){}
double calMoney(int c)
{
if(c >= min_py)
{
return c * price * discocunt;
}
else
{
return c * price;
}
}
void test()
{
cout<<endl<<"子类测试!!"<<endl;
}
private:
int min_py;
double discocunt;
};

//引用转换和指针转化可以实现动态绑定,即多态
//对象转化不能实现动态绑定

//对象转化
void test_print_11(ostream &out,Item_base item,size_t n)
{
out<<"ISBN :"<<item.book()<<"\t total monkey = "<<item.calMoney(n)<<endl;
}

//引用转换
void test_print_22(ostream &out,Item_base &item,size_t n)
{
out<<"ISBN :"<<item.book()<<"\t total monkey = "<<item.calMoney(n)<<endl;
}

//指针转换
void test_print_33(ostream &out,Item_base *item,size_t n)
{
out<<"ISBN :"<<item->book()<<"\t total monkey = "<<item->calMoney(n)<<endl;
}

int main()
{
Item_base item("x-123-1234-x",10.0);

Bulk_item item2("123-456-x",10.0,10,0.8);

test_print_11(cout,item,10);//对象 转换不能实现多态
test_print_11(cout,item2,10);

cout<<endl;
test_print_22(cout,item,10);//引用转换
test_print_22(cout,item2,10);

cout<<endl;
test_print_33(cout,&item,10);//指针转换
test_print_33(cout,&item2,10);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: