公有继承:public
#include<iostream>
#include<cstring>
using namespace std;
class Shape {
/*
* 子类Circle采用公有的方式继承了Shape的属性,但是在子类Circle内部是不能访问父类Shape的private的属性的
* 任何情况下,private是一个类的本性,只能在这个类的内部使用,(除了友元函数)
* 为此我们可以定义为protect,外部不能访问,但是子类的内部可以直接使用,但是子类的外部仍然无法访问*/
/*private:
char name[8];
char color[8];
*/
protected://protected内部访问没有问题,外部不能访问,从当前的这个功能来说和private非常相似,但是他的作用主要体现在继承的时候
char name[8];
char color[8];
void Draw();
//我们将Draw()加入到protected之后,他就不再是对外的方法了,我们也就无法通过s.Draw();来调用它
public:
Shape(const char* name = "none", const char* color = "none");
void SetName(char* name);
void SetColor(char* color);
// void Draw();
};
class Circle :public Shape {//使用public继承,子类所有属性不变
private:
static const double PI;
double radius;
public:
Circle(const char* name = "none", const char* color = "none", double radius = 0);
double Area();
void show();
};
int main() {
Shape s("shape ", "red");
Circle c("circle ", "blue", 10);
//s.Draw();
//c.Draw();//同时Circle继承了Shape的属性,由于Draw()是protected属性,他也继承过来了,所以他也无法调用
c.show();//protected成员从父类继承到了子类,那么他在子类的内部是可以直接使用的,于是写了一个show()方法
return 0;
}
/*
* 总结:
* public:一个类与外部沟通的桥梁
* protect:子类和父类沟通的桥梁
* private:一个类内部沟通的桥梁
*/
/*************父类:图形的实现*****************/
Shape::Shape(const char* name, const char* color)
{
strcpy_s(this->name, strlen(name) + 1, name);
strcpy_s(this->color, strlen(color) + 1, color);
}
void Shape::SetName(char* name)
{
strcpy_s(this->name, strlen(name) + 1, name);
}
void Shape::SetColor(char* color)
{
strcpy_s(this->color, strlen(color) + 1, color);
}
void Shape::Draw()
{
cout << "Draw " << name << "with color " << color << endl;
}
/*************子类:圆的实现*****************/
const double Circle::PI = 3.14;
Circle::Circle(const char* name, const char* color, double radius) :Shape(name, color)
{
this->radius = radius;
}
double Circle::Area() {
return PI * radius * radius;
}
void Circle::show() {
Draw();
cout << this->radius << endl;
}
private