C++ Primer(第五版) 15.3--15.5节练习

这篇博客主要讨论了C++ Primer第五版中关于虚函数和派生类的实践问题,涵盖了debug()函数的使用、override和final关键字的作用、无限递归的避免、构造函数调用顺序、net_price()函数的应用限制、派生类对象的赋值规则、以及不同继承方式下的类型转换规则。此外,还提到了测试代码示例和一个涉及多层继承的类继承体系。

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

15.11    添加了debug()函数

#ifndef	QUOTE_H
#define	QUOTE_H

#include <iostream>

using namespace std;

class Quote {
public:
	Quote() = default;
	Quote(const string &book, double sales_price):
				bookNo(book), price(sales_price) { }
	string isbn() const { return bookNo; };
	virtual double net_price(size_t n) const
					{ return n * price; }
	virtual void debug() { cout << "bookNo: "<< bookNo << " price: " << price << endl; }
	virtual ~Quote() = default;
private:
	string bookNo;
protected:
	double price = 0.0;
};

class Bulk_quote: public Quote {
public:
	Bulk_quote() = default;
	Bulk_quote(const string &book, double p, size_t qty, double disc):
		Quote(book, p), min_qty(qty), discount(disc) { }
	void debug() override { Quote::debug(); cout << "min_qty= " << min_qty << " discount= " << 
				discount << endl; }
	double net_price(size_t) const override;
private:
	size_t min_qty = 0;
	double discount = 0.0;
};

class Lim_quote: public Quote {
public:
	Lim_quote() = default;
	Lim_quote(const string &book, double p, size_t qty, double disc):
		Quote(book, p), max_qty(qty), discount(disc) { }
	void debug() override { Quote::debug(); cout << "max_qty= " << max_qty << " discount= " << 
				discount << endl; }
	double net_price(size_t) const override;
private:
	size_t max_qty = 0;
	double discount = 0.0;
};

double print_total(ostream &os, const Quote &item, size_t n);


#endif

15.12    override:如果用override标记了某函数,但并未覆盖已存在的虚函数,将报错;final:函数定义为final,覆盖该函数的操作将引发错误。

15.13    将导致无限递归,修改:

#include <iostream>

using namespace std;

class base {
public:
	base(const string &s): basename(s) { }
	string name() { return basename; }
	virtual void print(ostream &os) { os << basename; }
private:
	string basename;
};

class derived: public base {
public:
	derived(const string &s, int val): base(s), i(val) { }
	void print(ostream &os) override { base::print(os); os << " " << i; } 
private:
	int i;
};

int main()
{
	base b("base");
	derived d("derived", 6);
	
	b.print(cout);
	cout << endl;
	d.print(cout);
	cout << endl;
	
	return 0;
	
}

15.14    基类;    派生类;    基类;    基类; 基类;    派生类

15.15    

#ifndef	QUOTE_H
#define	QUOTE_H

#include <iostream>

using namespace std;

class Quote {
public:
	Quote() = default;
	Quote(const string &book, double sales_price):
				bookNo(book), price(sales_price) { }
	string isbn() const { return bookNo; };
	virtual double net_price(size_t n) const
					{ return n * price; }
	virtual void debug() { cout << "bookNo: "<< bookNo << " price: " << price << endl; }
	virtual ~Quote() = default;
private:
	string bookNo;
protected:
	double price = 0.0;
};

class Disc_quote: public Quote {
public:
	Disc_quote() = default;
	Disc_quote(const string &book, double price, size_t qty, double disc):
			Quote(book, price), quantity(qty), discount(disc) { }
	double net_price(size_t) const = 0;
protected:
	size_t quantity = 0;
	double discount = 0.0;
};

class Bulk_quote: public Disc_quote {
public:
	Bulk_quote() = default;
	Bulk_quote(const string &book, double p, size_t qty, double disc):
			Disc_quote(book, p, qty, disc) { }
	double net_price(size_t) const override;
private:
	size_t min_qty = 0;
	double discount = 0.0;
};

class Lim_quote: public Disc_quote {
public:
	Lim_quote() = default;
	Lim_quote(const string &book, double p, size_t qty, double disc):
			Disc_quote(book, p, qty, disc) { }
	double net_price(size_t) const override;
private:
	size_t max_qty = 0;
	double discount = 0.0;
};

double print_total(ostream &os, const Quote &item, size_t n);


#endif

15.16    net_price()函数不需要改变

15.17   无法声明Disc_quote对象。

15.18   d1和dd1能够合法赋值,其他不行。只有当派生类公有的继承基类时,用户才能使用派生类向基类的转换。

15.19    Derived_from_Private不合法;当D继承自B:对于用户代码,只有公有继承,能使用D到B的转换;对于D的成员和友元,任何继承方式都能使用D到B的转换;对于D的派生类的成员和友元,公有和保护继承能使用D到B的转换。

15.20    测试代码如下 ,注释掉的部分时非法的:

#include <iostream>

using namespace std;

class Base 
{
public:
	void pub_mem();
protected:
	int prot_mem;
private:
	char priv_mem;
};

struct Pub_Derv: public Base 
{
	int f() { return prot_mem; }
	void memfcn(Base &b)
	{
		b = *this;
		cout << "Pub_Derv" << endl;
	}
};

struct Priv_Derv: private Base 
{
	int f1() const { return prot_mem; }
	void memfcn(Base &b)
	{
		b = *this;
		cout << "Priv_Derv" << endl;
	}
};

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

struct Derived_from_Public: public Pub_Derv 
{
	int use_base() { return prot_mem; }
	void memfcn(Base &b)
	{
		b = *this;
		cout << "Derived_from_Public" << endl;
	}
};
/*
struct Derived_from_Private: public Priv_Derv 
{
	int use_base() { return prot_mem; }
	void memfcn(Base &b)
	{
		b = *this;
		cout << "Derived_from_Private" << endl;
	}
};
*/
struct Derived_from_Protected: protected Prot_Derv 
{
	int use_base() { return prot_mem; }
	void memfcn(Base &b)
	{
		b = *this;
		cout << "Derived_from_Protected" << endl;
	}
};

int main()
{
	Pub_Derv d1;
	Priv_Derv d2;
	Prot_Derv d3;
	
	Derived_from_Public dd1;
//	Derived_from_Private dd2;
	Derived_from_Protected dd3;
	
	//用户代码
	Base base;
	Base *p = &d1;
//	p = &d2;
//	p = &d3;
	
	p = &dd1;
//	p = &dd2;
//	p = &dd3;
	
	//成员调用
	d1.memfcn(base);
	d2.memfcn(base);
	d3.memfcn(base);
	
	//派生类的成员调用
	dd1.memfcn(base);
//	dd2.memfcn(base);
	dd3.memfcn(base);
	
	return 0;
}

15.21    (b)的继承体系:公共基类Figure,派生类Figure_2D和Figure_3D继承自Figure,方格和圆继承自Figure_2D,球和圆锥继承自Figure_3D。

15.22    

#ifndef	FIGURE_H
#define	FIGURE_H

class Figure {
public:
	Figure(double, double);
private:
	double x, y;
};

class Figure_2D: public Figure {
public:
	Figure_2D(double, double);
	virtual double area() = 0;
	virtual double perimeter() = 0;
};

class Figure_3D: public Figure {
public:
	Figure_3D(double, double, double);	
	virtual double cubage() = 0;
protected:
	double zSize;
};

class Retangle: public Figure_2D {
public:
	Retangle(double, double);
	double area() override;
	double perimeter() override;
};

class Circle: public Figure_2D {
public:
	Circle(double, double);
	double area() override;
	double perimeter() override;
};

class Sphere: public Figure_3D {
public:
	Sphere(double, double, double);
	double cubage() override;
};

class Cone: public Figure_3D {
public:
	Cone(double, double, double);
	double cubage() override;
};

#endif

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值