第十五章部分课后习题

本文探讨了C++中的继承、访问修饰符与多态性的概念。通过实例展示了Public_Derv、Priv_Derv和Prot_Derv等类如何从Base类继承,并分析了成员函数的访问权限。同时,练习15.28和15.29关注了容器(如vector)中对象的使用,以及引用和指针在多态场景下的行为差异,强调了虚函数在实现动态多态性中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

15.18

#include <iostream>

using namespace std;

class Base {
public:
    void pub_mem();
protected:
    int prot_mem;
    void memfcn(Base &b) { b = *this; }
private:
    char priv_mem;
};

struct Pub_Derv : public Base {
    int f() {return prot_mem; }
    //char g() {return priv_mem; } //错误
    void memfcn(Base &b) { b = *this; }
};

struct Priv_Derv : private Base {
    //private不影响派生类的访问权限
    int f1() const {return prot_mem; }
    void memfcn(Base &b) { b = *this; }
};

struct Prot_Derv : protected Base {
    int f2() const {return prot_mem; }
    void memfcn(Base &b) { b =* this; }

};

struct Derived_from_Public : public Pub_Derv {
    int use_base() {return prot_mem; }
    void memfcn(Base &b) { b = *this; }

};

struct Derived_from_Protected : public Prot_Derv {
    int use_base() {return prot_mem; }
    void memfcn(Base &b) { b = *this; }
};

struct Derived_from_Private : public Priv_Derv {
    //错误:Base::prot_mem在Priv_Derv中是private
    //int use_base() {return prot_mem; }

    //void memfcn(Base &b) { b = *this; }

};


int main(int argc, char **argv){
    Pub_Derv d1;
    Priv_Derv d2;
    Prot_Derv d3;
    Derived_from_Public dd1;
    Derived_from_Private dd2;
    Derived_from_Protected dd3;
    d1.pub_mem();
    //d2.pub_mem(); 错误
    //d3.pub_mem(); 错误
    Base *p = &d1;
    //p=&d2; //错误
    //p=&d3; 错误
    p=&dd1;
    ///p=&dd2; 错误
    //p=&dd3; 错误

}

**练习15.28:**存放一个Quote对象的vector,将Bulk_quote对象传入其中。计算vector中所有元素总的net_price。

答:

int main(int argc, char **argv){
    std::vector<Quote> vq;
    double sum = 0.0;
    vq.push_back(Bulk_quote("0-201-54848-7", 50, 10, 0.25));
    vq.push_back(Bulk_quote("0-201-54848-8", 60, 10, 0.25));
    for(auto q : vq){
        sum += q.net_price(40);
    }
    std::cout << sum << std::endl;//4400
}

**练习15.29:**再运行一次你的程序,这次传入Quote对象的shared_ptr。如果这次计算出的总额与之前的程序不一致,解释为什么:如果一致,也请说明原因。

答:

int main(int argc, char **argv){
    std::vector<Quote> vq;
    double sum = 0.0;
    vq.push_back(Bulk_quote("0-201-54848-7", 50, 10, 0.25));
    vq.push_back(Bulk_quote("0-201-54848-8", 60, 10, 0.25));
    for(auto q : vq){
        sum += q.net_price(40);
    }
    std::cout << sum << std::endl;//4400

    std::vector<std::shared_ptr<Quote>> vsq;
    double sum2 = 0.0;
    vsq.push_back(std::make_shared<Bulk_quote>("0-201-54848-7", 50, 10, 0.25));
    vsq.push_back(std::make_shared<Bulk_quote>("0-201-54848-8", 60, 10, 0.25));
    for(auto q2 : vsq){
        sum2 += q2->net_price(40);
    }
    std::cout << sum2 << std::endl;//1100
}

不一致,调用的虚函数不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值