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
}
不一致,调用的虚函数不一样。