习题15-1
虚成员是基类希望派生类进行覆盖的函数,在其成员前加关键字virtual,使得该成员可以实现动态绑定。
习题15-2
private成员:即使是基类的派生类也无法直接访问。
protected成员:基类的派生类可以访问,但禁止其它用户访问。
习题15-3
class Quote
{
public:
Quote() = default;
Quote(const std::string &book, double sales_price) :bookNo(book), price(sales_price){}
std::string isbn() const { return bookNo; }
virtual double net_price(std::size_t n) const { return n * price; }
virtual ~Quote() = default;
private:
std::string bookNo;
protected:
double price = 0.0;
};
习题15-4
(a) 类重复定义,不能自己继承自己
(b) 这是类的定义,并不是声明 ;
(c) 类的声明不包含类派生列表;
习题15-5
class Bulk_quote : public Quote
{
public:
Bulk_quote() = default;
Bulk_quote(const std::string& book, double price, std::size_t qty, double disc) : Quote(book, price), min_qty(qty), discount(disc) {}
double net_price(std::size_t) const override;
private:
std::size_t min_qty = 0;
double discount;
};
double Bulk_quote::net_price(size_t cnt) const
{
if (cnt >= min_qty) {
return cnt * (1-discount) * price;
}
else {
return cnt * price;
}
}
习题15-6
略
习题15-7
class Limit_quote : public Quote
{
public:
Limit_quote() = default;
Limit_quote(const std::string& book, double price, std::size_t qty, double disc) : Quote(book, price), max_qty(qty), discount(disc) {}
double net_price(std::size_t) const override;
private:
std::size_t max_qty = 0;
double discount;
};
double Limit_quote::net_price(size_t cnt) const
{
if (cnt <= max_qty) {
return cnt * (1-discount) * price;
}
else {
return (cnt-max_qty) * price + max_qty * (1-discount) * price;
}
习题15-8
表达式的静态类型在编译时总是已知的,它是变量声明时的类型或表达式生成的类型。
动态类型则是变量或表达式表示的内存中的对象的类型,动态类型直到运行时才可知。
习题15-9
基类的指针或引用的静态类型可能与其动态类型不一致,如果表达式既不是指针也不是引用,则它的动态类型永远与静态类型一致。
习题15-10
std::ifstream
是 std::istream
的派生基类,因此 read 函数能够正常工作。