版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/clksjx/article/details/88850625
继承
父类:
- base class
- super class
- parent class
子类:
- derived class
- sub class
- child class
class A{
public:
A(int ii):i(ii) { cout<< "A::A()"<<endl;}
~A() { cout << "A::~A()"<<endl;}
void print() { cout<<"A::print()"<<i<<endl;}
protected:
void setI(int i) { this->i = i;}
private:
int i;
}
class B : public A {
public:
B():A(15){}//子类构造函数的初始化列表需要包括父类的初始化,父类初始化放在最前,之后的变量初始化按照在类中出现的顺序放置
void f()
{
setI(20);//子类可以访问父类的protected成员
//i = 30;//子类不可访问父类的private成员
print();
}
}
int main(){
B b;//自动调用父类的构造函数
//b.set(10);//外人不可使用protected成员
b.print();
b.f();
return 0;
}
构造时,先构造父类。析构时,先析构子类。
父类与子类的调用关系
如果子类中有与父类函数名相同的成员函数,当子类想调用父类的函数,可在函数名前加父类名::
,作以区分。
函数重载
函数具有相同的函数名,但具有不同的参数。
defeult arguments
在函数声明时,可以给参数赋值。如果函数被调用时没有这个参数(如f(2)),则该参数在函数中将使用默认值(f(2,0))。
f(int a, int b = 0);
注意:
- 默认参数要从最右面的参数写,不能为a设置了默认参数,而b没有。
- 尽量不要使用default argument,以减少阅读难度和不安全性