基类 & 派生类
当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
其中,集成通过': '来进行继承,继承包括protect,public,provite三种继承,其中三种区别如下:
| 访问 | public | protected | private |
|---|---|---|---|
| 同一个类 | yes | yes | yes |
| 派生类 | yes | yes | no |
| 外部的类 | yes | no |
no
|
#include<cstdio>
#include<iostream>
using namespace std;
class A
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
class B:protect A
{
public:
int getArea()
{
return (width * height);
}
};
int main()
{
A a;
a.setWidth(5);
a.setHeight(10);
cout<<Rect.getArea()<<endl;
return 0;
};
一个派生类继承了所有的基类方法,但下列情况除外:
- 基类的构造函数、析构函数和拷贝构造函数。
- 基类的重载运算符。
- 基类的友元函数。
三种继承类型分别继承出来的派生类对象类型:
- 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
- 保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。
- 私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。
多继承
一个派生类可以继承多个基类:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};
实例:
#include <iostream>
using namespace std;
// 基类 Shape
class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// 基类 PaintCost
class PaintCost
{
public:
int getCost(int area)
{
return area * 70;
}
};
// 派生类
class Rectangle: public Shape, public PaintCost
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
// 输出对象的面积
cout << "Total area: " << Rect.getArea() << endl;
// 输出总花费
cout << "Total paint cost: $" << Rect.getCost(area) << endl;
return 0;
}
结果:
Total area: 35
Total paint cost: $2450
多继承如果出现环状继承时,如A为基类,B->A,C->A,D->A->B,这样就会导致父类A要重新创建新对象,要解决上面问题就要用虚拟继承格式
class 类名: virtual 继承方式 父类名
如下:
#include <iostream>
using namespace std;
//基类
class A
{
public:
A(){cout<<"A()"<<endl;}
~A(){cout<<"~A()"<<endl;}
protected:
int a;
};
class B:virtual public A
{
public:
B(){cout<<"B()"<<endl;}
~B(){cout<<"~B()"<<endl;}
protected:
int b;
};
class C:virtual public A
{
public:
C(){cout<<"C()"<<endl;}
~C(){cout<<"~C()"<<endl;}
protected:
int c;
};
class D:public B, public C
{
public:
D(){cout<<"D()"<<endl;}
~D(){cout<<"~D()"<<endl;}
protected:
int d;
};
int main()
{
cout << "Hello World!" << endl;
D d; //A,B,C,D
cout<<sizeof(d)<<endl;
return 0;
}

本文探讨了C++中的继承概念,包括基类与派生类的关系,详细阐述了public、protected、private三种继承方式的区别。此外,还介绍了多继承的实现,并提及了在多继承中如何处理环状继承问题,通过虚拟继承来避免对象重复创建。
继承&spm=1001.2101.3001.5002&articleId=81949018&d=1&t=3&u=cd9a2823e4ec44fea48e7dc19bd97687)
240

被折叠的 条评论
为什么被折叠?



