Skip to content

c++ 类的继承

前情提要

啥是基类来着?

基类就是 咱们一直写着的类啊

C++
class line 
{first () //函数

}

这是基类

基类和派生类

刚才的代码时基类

我举一个派生类的例子

c++
class lines : public LONG {
    HOWlong()//函数
};  //这是派生
c++
class derived-class: access-specifier base-class

其中,访问修饰符 access-specifier 是 public、protectedprivate 其中的一个,base-class 是之前定义过的某个类的名称。如果未使用访问修饰符 access-specifier,则默认为 private。(这句话来自菜鸟教程) 妹写就是private

c++
//案例取自菜鸟教程
#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);  //public 可以访问
 
   // 输出对象的面积
   cout << "Total area: " << Rect.getArea() << endl;
 
   return 0;
}

结果是Total area: 35

我们可以根据访问权限总结出不同的访问类型,如下所示:

访问publicprotectedprivate
同一个类可以可以可以
派生类可以可以不行(参考之前) 兄弟 怎么能访问private呢
外部的类可以可以不行

一个派生类继承了所有的基类方法,但下列情况除外:

一个派生类继承了所有的基类方法,但下列情况除外:

  • 基类的构造函数、析构函数和拷贝构造函数。
  • 基类的重载运算符。
  • 基类的友元函数。 ( 友元函数)

继承的类型

当一个类派生自基类,该基类可以被继承为 : 后面加上 public / private protected | class lines : () line{} ;

  • 公有继承(public) 被任何访问 ( 参考列表)

  • 保护继承(protected): 当一个类派生自保护基类时,基类的公有保护成员将成为派生类的保护成员。

  • 私有继承(private):当一个类派生自私有基类时,基类的公有保护成员将成为派生类的私有成员。

多继承

c++
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};

道理都一样

  • 在基类里你可以尝试 给对象进行引用 像指针一样

类的公用机制?

c++
A a1; // 基类
B b1;  // 派生类
A & r =a1; // r 的地址是a1  引用了a1
//也就是说类似于*ptr = &a1 公用一个存储的空间

虚基类

  • 抛砖引玉首先知道一下什么是多重继承引起的二义性问题
c++
class A 
{
 public:
        int a;
        void display ();
};
class B 
{
public:
      int a ;
      void display();

};
class C :public A, public B
{
public :
        int b;
        vioid show()
};
  • 这是个简略的框架
c++
int main ()  // 主函数调用 C 
{
 C c1;
 c1.a = 3;
c1.display();
}
  • 会报错 因为 public A ,B 里面都有a 和display 函数 导致 编译器不认识哪个 成员 修改方案为

c1.A::a=3; // 引用 c1.::display(); //调用指定的A 的函数 这是一种解决方案

虚基类

上面我说了 二义性问题会导致报错 需要 唯一性标识 Class A ; 就需要 a1.A::display(){}这种操作来进行标识 , 在一个类里保留 一堆的共同基类里面的多份 成员 虽然有必要 能存不同的数据, 也可以进行初始化构造函数 但是多数情况下是不愿意看到的一大坨东西 还得挨个分辨 占用更多的空间 我们有更好的方法 如题所示虚基类就是个很好的方法 c++提供虚基类 可以在继承间接共同基类的 同时只保留一份的成员

我给大家演示一下 A                 经典菱形继承. B (B C 指向A ) C D (D 指向b c)

bc 分别继承了D 的函数 a 和 display() (假设), D 里面就会拷贝A;

C++
//声明虚基类
class A{};
class B : virtual public A     // virtual 就是声明的办法
{};

class Name :virtual base-class Name2 声明放式| Name 和Name2 是派生类 和基类名字 base-class是继承方式 (备注 要能在派生类声明)

声明后只在类里面声明了一次

虚基类作用 为了解决多继承时的命名冲突和冗余数据问题,使得派生类中只保留一份间接基类的成员。 其本质是是让某个类做出声明,承诺愿意共享它的基类。其中,这个被共享的基类就称为虚基类(Virtual Base Class)

还是刚才那个 ABCD 问题  如果有一个B 或者 C 声明了虚基类 情况就不一样了  因为 派生类的声明的函数永远高于 那个虚基类 不会冲突 不会产生二义性问题 两个都是虚基类 是 直接 从A访问的 不用管 虚派生只影响从指定了虚基类的派生类中进一步派生出来的类,它不会影响派生类本身。