菜鸟前路---c++从入门到进阶(1)

版权声明:属原创,引用请指明出处 https://blog.csdn.net/qq_43624878/article/details/86085647

c++中的继承

突然找到以前总结的东西,共享一下,也供新手学习,和复习。。。

一。继承是面向对象程序设计中最重要的一个概念。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行时间的效果。
当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。

二。基类 & 派生类
一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如下:

class derived-class: access-specifier base-class

其中,访问修饰符 access-specifier 是 public、protected 或 private 其中的一个,base-class 是之前定义过的某个类的名称。如果未使用访问修饰符 access-specifier,则默认为 private。
假设有一个基类 Shape,Rectangle 是它的派生类,如下所示:
上代码:

#include <iostream>
 using namespace std;
 // 基类 
class Shape {
 public:
 void setWidth(int w) { 
width = w; }
 	void setHeight(int h) { 
height = h; }
protected: 
int width; 
int height; 
};
 // 派生类 
class Rectangle:public Shape {
public:
 	int getArea() {
 return (width * height); }
 };
 int main(void) { 
Rectangle Rect; 
Rect.setWidth(5);
 Rect.setHeight(7); // 输出对象的面积 
cout << "Total area: " << Rect.getArea() << endl; 
return 0;
 }

当上面的代码被编译和执行时,将得到如下结果:

Total area=35;

三。访问权限和继承
派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private
一个派生类继承了所有的基类方法,但下列情况除外:
1.基类的构造函数、析构函数和拷贝构造函数
2.基类的重载运算符
3.基类的友元函数
继承类型
当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。继承类型是通过上面讲解的访问修饰符 access-specifier 来指定的。
我们几乎不使用 protected 或 private 继承,通常使用 public 继承。
公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
多继承
多继承即一个子类可以有多个父类,它继承了多个父类的特性。
C++ 类可以从多个类继承成员
上代码:

#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->D, B->D, C->(A,B),这个继承会使D创建两个对象,要解决上面问题就要用虚拟继承格式
格式:class 类名: virtual 继承方式 父类名,即 多态
上代码:

#include <iostream>

using namespace std;
//基类

class D
{
public:
    D(){cout<<"D()"<<endl;}
    ~D(){cout<<"~D()"<<endl;}
protected:
    int d;
};

class B:virtual public D
{
public:
    B(){cout<<"B()"<<endl;}
    ~B(){cout<<"~B()"<<endl;}
protected:
    int b;
};

class A:virtual public D
{
public:
    A(){cout<<"A()"<<endl;}
    ~A(){cout<<"~A()"<<endl;}
protected:
    int a;
};

class C:public B, public A
{
public:
    C(){cout<<"C()"<<endl;}
    ~C(){cout<<"~C()"<<endl;}
protected:
    int c;
};

int main()
{
    cout << "Hello World!" << endl;
    C c;   //D, B, A ,C
    cout<<sizeof(c)<<endl;
    return 0;
}

共同进步吧,哈哈在这里插入图片描述
也感谢“菜鸟”的帮助。

猜你喜欢

转载自blog.csdn.net/qq_43624878/article/details/86085647