第11章:类面向对象理念

1,面向对象具体使用理念
2,源码

#include <iostream>
#include <vector>
#include <memory>
/*
1,基类:  通常在层次关系的根部有一个基类
2,派生类:直接或间接从基类基础而来,这些继承得到的类称为派生类
3,虚函数:对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时基类就将这些函数声明成虚函数,任何构
          造函数之外的非静态函数都可以是虚函数
4,protected:派生类可以有权访问该成员,同时禁止其他用户访问,可以用proteced说明这样的成员,派生类可以访问
   共有成员函数,禁止访问私有成员函数
5,override:如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,如果我们使
   用override标记了某个函数,但该函 数并没有覆盖已存在的虚函数,此时编译器将会报错
6,派生类对象含有从基类继承而来的成员,但是派生类并不能直接处时候这些成员,派生类也须使用基类的构造函数来初
   始化它的基类部分
7,动态绑定:只有我们通过指针或引用调用虚函数时候才会发生
8,多态性:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的
   函数,如果对象类型是派生类就调用派生类的函数;如果对象类型是基类,就调用基类的函数
   <1>:用virtual关键字申明的函数叫做虚函数,虚函数可定时类的成员函数
   <2>:存在虚函数的类都有一个一维的虚函数表叫做虚表,类的兑现有一个指向虚表开始的虚指针,虚表和类对应的,
       虚表指针和对象对应的
   <3>:多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性
   <4>:多态用虚函数来实现,结合动态绑定
   <5>:纯虚函数是虚函数再加上=0
   <6>:抽象类是指包括至少一个纯虚函数的类
   <7>:纯虚函数:virtual void fun() = 0;即抽象类必须在子类实现这个函数,即先有名称,没有内容,在派生类实现内容;
       含有纯虚函数的类是抽象基类
9,虚函数const修饰,虚函数的要求是:函数原型相同(函数返回值、函数名,参数列表、const修饰符),const修饰符
   包括函数返回值的修饰、函数形参的修饰、函数本身的修饰,只要有一处const没有对上、那么就不是虚函数的重载,而
   是发生了同名覆盖的现象
10,基类通常都应该定义一个虚析构函数,即使该函数不执行任何实际操作也是如此
11,继承与静态成员函数:如果基类定义了一个静态成员函数,则在整个继承体系中只存在该成员函数唯一定义
12,当且仅当通过指针或引用调用虚函数时,才会在运行时解析该调用,也只有在这种情况下对象的动态类型才有可能与静
   态类型不同
13,派生类构造函数只初始化的它的直接基类
14,当我们使用容器存放继承体系中的对象时,通常必须采用间接存储的方式,不能把具有继承关系的多种类型对象直接存
   放在容器当中;当我们希望在容器中存放具有继承关系的对象时,我们实际上存放的通常是基类的指针(更好的选择是
   智能指针)
*/


using namespace std;
//类的声明
class Quote;
class Bulk_quote;

//基类
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;


};


//派生类
class Bulk_quote : public Quote
{
 public:
    Bulk_quote() = default;

    //派生类通过基类的够着函数来初始化它的基类部分
    Bulk_quote(const std::string& book, double p, std::size_t qty, double disc) : Quote(book,p),min_qty(qty),discount(disc)
    {

    }

    double net_price(std::size_t) const override;

 private:
    std::size_t min_qty = 0;

    double discount = 0.0;
};


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



int main()
{
    //容器与类的使用
    vector<shared_ptr<Quote>> basket;
    basket.push_back(make_shared<Quote>("0-201-82470-1", 50));
    basket.push_back(make_shared<Bulk_quote>("0-201-54848-8", 50, 10, .25));
    cout <<basket.back()->net_price(15) <<endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/ksmtnsv37297/article/details/89444985
今日推荐