继承
继承允许我们依据另一个类来定义一个新的类,这样做达到了重用代码,和提高执行率的效果.当创建一个类时,不需要重新编写新的成员变量和成员函数,只需指定新建的类继承了一个已有的类即可.这个已有的类称之为基类(父类),新建的类称之为派生类(子类).一个类可以继承自多个父类,可以从多个基类继承数据和函数.
多继承和菱形继承
类A,类B继承father,类C继承A和B,这样在C中会有两个同名成员变量a,导致不知道具体用的哪一个基类中的a,会产生二义性问题。
解决菱形继承中,父类被继承多次的问题,使用虚继承可以解决.虚继承时只会继承到一份.
#include
using namespace std;
class father
{
public :
int a;
};
class A:virtual public father{};//虚继承会创建一个虚指针
class B:virtual public father{};
class C:public A,public B{};
Int main(){
C c;
c.A::a = 2;//利用作用域解决二义性问题
c.a = 3;//利用虚继承解决二义性问题
return 0;}
运算符重载(函数重载)
c++运算符操作对象只局限于基本的内置数据类型(int,float,double,char等),但是对于我们自定义的类型(类)是没有办法操作的。但是大多数时候我们需要对类进行类似的运算,这个时候我们就需要对运算符重新定义,赋予其新的功能,来满足要求.
c++重载运算符的实质是函数重载.运算符重载实质上是c++的一种多态,叫做静态多态,目的是为了让我们使用同名的函数来完成不同的操作.
class box {
public:
int height;
int weight;
int length;
box() {
height = 1;
weight = 1;
length = 1;
}
box(int length, int weight = 1, int height = 1) {
this->length = length;
this->weight = weight;
this->height = height;
}
box operator+=(box other) { //返回值为box方便链式操作
this->height += other.height;
this->weight += other.weight;
this->length += other.length;
return *this;
}
box& operator +(box& other) {
box b;
b.height = this->height + other.height;
b.weight = this->weight + other.weight;
b.length = this->length + other.length;
return b;
}
int operator >(box& other) {
if (this->height > other.height)
return 1;
else
return 0;
}
};
ostream& operator<<(ostream& o, box b) { //返回值为ostram方便链式操作
o << b.height << " " << b.length << " " << b.weight << endl;
return o;
}
int main() {
box b1, b2,b3;
b1 += b2;//b1.operator+=(b2);
b1 += b2 += b3;
b1.operator+=(b2.operator+=(b3));
/*左值:有名字,能找到地址能修改 右值:没有名字,找不到地址不能修改
左值引用用& 右值引用用&&*/
b1.operator+(b2.operator+(b3));
b1 > b2;
box b;
cout << b << endl;
}