c++ 类的继承
前情提要
啥是基类来着?
基类就是 咱们一直写着的类啊
class line
{first () //函数
}
这是基类
基类和派生类
刚才的代码时基类
我举一个派生类的例子
class lines : public LONG {
HOWlong()//函数
}; //这是派生
class derived-class: access-specifier base-class
其中,访问修饰符 access-specifier 是 public、protected 或 private 其中的一个,base-class 是之前定义过的某个类的名称。如果未使用访问修饰符 access-specifier,则默认为 private。(这句话来自菜鸟教程) 妹写就是private
//案例取自菜鸟教程
#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
我们可以根据访问权限总结出不同的访问类型,如下所示:
访问 | public | protected | private |
---|---|---|---|
同一个类 | 可以 | 可以 | 可以 |
派生类 | 可以 | 可以 | 不行(参考之前) 兄弟 怎么能访问private呢 |
外部的类 | 可以 | 可以 | 不行 |
一个派生类继承了所有的基类方法,但下列情况除外:
一个派生类继承了所有的基类方法,但下列情况除外:
- 基类的构造函数、析构函数和拷贝构造函数。
- 基类的重载运算符。
- 基类的友元函数。 ( 友元函数)
继承的类型
当一个类派生自基类,该基类可以被继承为 : 后面加上 public / private protected | class lines : () line{} ;
公有继承(public) 被任何访问 ( 参考列表)
保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。
私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。
多继承
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};
道理都一样
- 在基类里你可以尝试 给对象进行引用 像指针一样
类的公用机制?
A a1; // 基类
B b1; // 派生类
A & r =a1; // r 的地址是a1 引用了a1
//也就是说类似于*ptr = &a1 公用一个存储的空间
虚基类
- 抛砖引玉首先知道一下什么是多重继承引起的二义性问题
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()
};
- 这是个简略的框架
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;
//声明虚基类
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访问的 不用管 虚派生只影响从指定了虚基类的派生类中进一步派生出来的类,它不会影响派生类本身。