c++学习(二)继承

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

基类 & 派生类

当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类

其中,集成通过': '来进行继承,继承包括protect,public,provite三种继承,其中三种区别如下:

访问publicprotectedprivate
同一个类yesyesyes
派生类yesyesno
外部的类yesno

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值