继承

84 阅读2分钟

继承是面向对象三大特性之一

我们发现,定义这些类,下级别的成员除了拥有上一级的共性,还有自己的特性。

这个时候我们就可以考虑利用继承的技术,减少重复代码

继承的基本语法

例如我们看到很多网站中,都有公共的头部,公共的底部,甚至公共的左侧列表,只有中心内容不同

接下来我们分别利用普通写法和继承的写法来实现网页中的内容,看一下继承存在的意义以及好处。

继承方式

继承的语法:class 子类 : 继承方式 父类

继承方式一共有三种:

  • 公共继承
  • 保护继承
  • 私有继承

image.png

公有继承

class BasePage{
    public:
    BasePage(int pn, std::string pt):pageNumber(pn), pageTitle(pt){
        std::cout << "This is the base page constructor" << std::endl;
    }
    BasePage() = default;
    void print_contents(){
        std::cout << "This is the base page content" << std::endl;
    }

    private:
        int pageNumber;
        std::string pageTitle;
};

class SubPage : public BasePage{
    public:
    SubPage(int pn, std::string pt, std::string c):BasePage(pn, pt), content(c){}
    void print_contents(){
        std::cout << "This is the sub page content" << std::endl;
        std::cout << content << std::endl;
    }
    private:
        std::string content;
    // int pageNumber;
    // std::string pageTitle;
};

int main(){
    SubPage sp(1, "title", "content");
    sp.print_contents();
}

保护继承

class BasePage{
    public:
    BasePage(int pn, std::string pt):pageNumber(pn), pageTitle(pt){
        std::cout << "This is the base page constructor" << std::endl;
    }
    BasePage() = default;
    void print_contents(){
        std::cout << "This is the base page content" << std::endl;
    }

    private:
        int pageNumber;
        std::string pageTitle;
};

class SubPage : public BasePage{
    public:
    SubPage(int pn, std::string pt, std::string c):BasePage(pn, pt), content(c){}
    void print_contents(){
        std::cout << "This is the sub page content" << std::endl;
        std::cout << content << std::endl;
    }
    private:
        std::string content;
    // int pageNumber;
    // std::string pageTitle;
};

// protected extends
class SubPageP : protected BasePage{
    public:
    SubPageP(int pn, std::string pt, std::string c):BasePage(pn, pt), content(c){}
    void print_contents(){
        std::cout << "This is the sub page content" << std::endl;
        std::cout << content << std::endl;
    }
    private:
        std::string content;
};


int main(){
    SubPage sp(1, "title", "content");
    sp.print_contents();
}

私有继承

class BasePage{
    public:
    BasePage(int pn, std::string pt):pageNumber(pn), pageTitle(pt){
        std::cout << "This is the base page constructor" << std::endl;
    }
    BasePage() = default;
    void print_contents(){
        std::cout << "This is the base page content" << std::endl;
    }
    protected:
        int subPage;
    private:
        int pageNumber;
        std::string pageTitle;
};

class SubPage : public BasePage{
    public:
    SubPage(int pn, std::string pt, std::string c):BasePage(pn, pt), content(c){}
    void print_contents(){
        std::cout << "This is the sub page content" << std::endl;
        std::cout << content << std::endl;
    }
    private:
        std::string content;
    // int pageNumber;
    // std::string pageTitle;
};

// protected extends
class SubPageP : protected BasePage{
    public:
    SubPageP(int pn, std::string pt, std::string c):BasePage(pn, pt), content(c){}
    void print_contents(){
        std::cout << "This is the sub page content" << std::endl;
        std::cout << content << std::endl;
    }
    private:
        std::string content;
};

// private extends
class SubPagePP : private BasePage{
    public:
        SubPagePP(int pn, std::string pt, std::string c):BasePage(pn, pt), content(c){}
        void print_contents(){
            std::cout << "This is the sub page content" << std::endl;
            std::cout << "subPage's value is " << subPage << std::endl;
            std::cout << content << std::endl;
        }
    private:
        std::string content;
};
int main(){
    SubPagePP spp(1,"subpage", "This is the sub page content");
    spp.print_contents();
}