CppPrimer自学(3)公有继承

**①如果在main函数里,main既不是父类的友元函数也不是成员函数,所以不能用父类里的私有成员和受保护的成员。
②在main函数里,即使是子类,也不能用父类受保护的成员。
③受保护的成员可以继承类用,但是父类是不能在类外的地方用,即使没在main函数里。**

*公有继承表示在继承类外(如main函数里),除了公有成员可以用,其他是不能的。受保护的在继承类里用是可以的 也是受保护的对象。
私有继承表示把父类公有的和受保护的都变成私有成员。*

#include <iostream>
#include <string>
using namespace std;

class Item_base //父类
{
public :
    //int x;
    Item_base(const string &book = " ", double sales_price = 0.0) :isbn(book), price(sales_price){}
    string book()const //访问私有的数据成员
    {
        return isbn;
    }
    virtual double net_price(size_t n) const //虚函数 被继承之后 派生类可以把虚函数重新定义 因为要批量购买, 比如单价是打折的
    {
        return n * price;
    }
private:
    string isbn;//书号
    //int y;
protected:
    double price;//价格    受保护的成员是用来作为继承的
};

class Bulk_item :public Item_base //子类
{
public:
    Bulk_item(const string &book = " ", double sales_price = 0.0,
        size_t qty = 0, double disc_rate = 0)
        :Item_base(book, sales_price), min_qty(qty), discount(disc_rate){}

    void test()
    {
    //  cout << x << endl;
        cout << price << endl;
    }

    void test2(const Bulk_item &d, const Item_base &b)
    {

        cout << d.price << endl;
        cout << b.book() << endl;

        //cout << b.price << endl; // 此处不能用父类的对象来使用price 因为受保护的可以在子类里用 但是不能在类外的地方老子用
    }

    double net_price(size_t cnt) const
    {
        if (cnt >= min_qty)
            return cnt*(1 - discount)*price;
        else
            return cnt*price;
    }
private:
    size_t min_qty;
    double discount;
};

int main()
{
    Item_base item("0-12-3456-789", 9.9);
    cout << item.book() << "," <<  item.net_price(10) << endl;

    Bulk_item item2("0-12-3456-789", 9.9, 10, 0.12);
    cout << item2.book() << "," << item2.net_price(10) << endl;

    item2.test();
    item2.test2(item2, item);
    system("pause");
}

1214Cpp多态

#include <iostream>
#include <string>
using namespace std;

class Item_base //父类(基类)
{
public:

    Item_base(const string &book = " ", double sales_price = 0.0) :isbn(book), price(sales_price){}
    string book()const //访问私有的数据成员
    {
        return isbn;
    }
    virtual double net_price(size_t n) const //虚函数 被继承之后 派生类可以把虚函数重新定义 因为要批量购买, 比如单价是打折的
    {
        return n * price;
    }
private:
    string isbn;//书号

protected:
    double price;//价格    受保护的成员是用来作为继承的
};

class Bulk_item :public Item_base //子类(派生类)
{
public:
    Bulk_item(const string &book = " ", double sales_price = 0.0,
        size_t qty = 0, double disc_rate = 0)
        :Item_base(book, sales_price), min_qty(qty), discount(disc_rate){}



    void test2(const Bulk_item &d, const Item_base &b)
    {

        cout << d.price << endl;
        cout << b.book() << endl;

        //cout << b.price << endl; // 此处不能用父类的对象来使用price 因为受保护的可以在子类里用 但是不能在类外的地方老子用
    }

    double net_price(size_t cnt) const
    {
        if (cnt >= min_qty)
            return cnt*(1 - discount)*price;
        else
            return cnt*price;
    }
private:
    size_t min_qty;
    double discount;
};

void print_total(ostream &os, Item_base *item, size_t n)
{
    os << "ISBN" << item->book() << "\tnumber sold: " << n << "\ttotal price:" << item->net_price(n) << endl;
}
int main() //如何实现多态  派生类和基类相互转换
                        //必须用指针或者引用去调用虚函数形成多态
{
    Item_base *a = new Item_base("1-234-567-01", 11.0);
    Bulk_item *b = new Bulk_item("1-234-567-02", 22.0, 2, 0.05);

    print_total(cout, a, 2);
    print_total(cout, b, 3);

    Item_base *books[5];
    books[0] = new Item_base("0-123-456-01", 10.0);
    books[1] = new Bulk_item("0-123-456-02", 20.0, 6, 0.05); //可以用动态分配的父类的变量new一个子类的对象
    books[2] = new Item_base("0-123-456-03", 30.0);
    books[3] = new Bulk_item("0-123-456-04", 40.0, 4, 0.15);
    books[4] = new Bulk_item("0-123-456-05", 50.0, 2, 0.18);

    int num[5];
    num[0] = 2;
    num[1] = 10;
    num[2] = 1;
    num[3] = 5;
    num[4] = 3;

    for (int i = 0; i < 5; i++)
    {
        print_total(cout, books[i], num[i]);
    }

    system("pause");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值