C++Primer-定义基类和派生类

定义基类

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;
};

基类通常都需要定义一个虚析构函数,即使此函数不执行任何操作

成员函数与继承
派生类可以继承基类的成员,然而当遇到与类型相关的操作时,派生类必须重新定义,也就是提供自己的新定义从而覆盖继承的旧定义
基类的成员函数分为两种,一种是希望派生类直接继承的函数(通过定义虚函数),一种是希望派生类进行新定义覆盖的函数。当使用指针或者引用调用虚函数时,该调用将被动态绑定
任何构造函数之外的非静态函数都可以是虚函数,virtual只能用于类内声明而不能用于类外定义

访问控制和继承
派生类可以继承基类的成员,但是不一定能访问,派生类只能访问公有的和被保护的部分

定义派生类
派生类要使用类派生列表注明从哪些类继承,以及访问权限,需要覆盖的要重新声明

class Bulk_Quote : public Quote
{
public:
    Bulk_quote() = default;
    Bulk_quote(const std::string&, double, std::size_t, double);
    double net_price(std::size_t) const override;
private:
    std::size_t min_qty = 0;
    double discount = 0.0;
};

派生类构造函数
派生类不能直接初始化基类的成员,必须使用基类的构造函数来初始化它的基类部分。派生类的构造函数通过初始化列表,把参数传给基类构造函数进行构造

继承与静态成员
基类定义的静态成员会成为整个继承体系的唯一定义

防止继承的发生
类名后面加final

静态类型和动态类型
静态类型在编译时是已知的,动态类型要到运行时才可知,静态类型是声明或表达式生成的类型,动态类型是变量或表达式表示的内存中的对象类型。若表达式不是指针或引用,则动态类型会与静态类型一致

类型转换
编译器存在隐式的派生类向基类的类型转换,不存在基类到派生类的类型转换
编译器的隐式类型转换只对指针和引用生效,对象之间不能直接转换,但是可以将派生类对象拷贝、移动或赋值给基类对象,这种情况下,派生类中除基类以外的部分将被切掉

全部评论

相关推荐

12-08 16:04
门头沟学院 Java
本人本科末9,今年大三。大一大二一直玩,什么都没学到,在大学混日子混了两年,每天不是在打农就是在steam。大三开学时一个和自己玩的好的同学去实习了,才发现自己白白浪费了两年的时间,如果真不冲一下就真去京东,阿里,美团送外卖了今年9月份开始学Java,一开始一直跟着黑马视频看,后面发现看视频效率太低了,时间根本不够,就开始主要看文档和看书了。这几个月一直在学,真的尽力了,希望暑期前能找一份好点的实习。我简历上面的项目大多没有指标,但是实际上我是真没多少时间去做项目,我基本主要是动手只做了外卖和天机,黑马点评和12306我都是只是看了项目。主要是自己的时间真的不多,但是这样子自己的代码能力确实比较差。而且自己也没有做过实际的工程,我顶多用jmeter测试一下接口tps啥的,比如使用Redis管道提升了一点性能,减少Redis交互,这种值得写上去吗?需不需要具体到某些数字求求各位佬给一些建议,看看简历怎么优化?项目介绍是不是不够详细?没有具体到业务方面。项目会不会提到大致实现原理导致面试官一看简历就知道怎么实现就没有问的欲望?专业技能一些字段是不是要加粗,是不是写太啰嗦了?有没有必要压缩内容变成一页?两页的话是不是都要把两页填地满满的。
给秋招一个交代:一页简历最好,网上做的项目放面试官眼里都是玩具,简历上不需要强调有什么难点,记住就行防止真的问。然后背八股,多投多面试就行
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务