继承是面向对象三大特性之一
我们发现,定义这些类,下级别的成员除了拥有上一级的共性,还有自己的特性。
这个时候我们就可以考虑利用继承的技术,减少重复代码
继承的基本语法
例如我们看到很多网站中,都有公共的头部,公共的底部,甚至公共的左侧列表,只有中心内容不同
接下来我们分别利用普通写法和继承的写法来实现网页中的内容,看一下继承存在的意义以及好处。
继承方式
继承的语法:class 子类 : 继承方式 父类
继承方式一共有三种:
- 公共继承
- 保护继承
- 私有继承
公有继承
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();
}