继承(inheritance)
一个类能从另一个类里面派生(derived),这个类叫基类(base class)。
★派生类继承基类除构造函数、析构函数和赋值函数之外的所有成员。
Base(父类、基类)---->derived(子类、派生类)
derived = base part + appendant part //派生类=基类部分+附加部分;
★基类的私有成员不能被派生类访问,只能通过基类的公有成员来访问。
例:
class A
{
private:
funcA();
public:
funcB(){funcA();};
};
class B->A
{
};
class C
{
private:
int c;
public:
int getC() {return c;}
int f(int, int){cout<<c<<endl;} //基类的函数f(int, int);
};
class D-->c
{
private:
int d;
public;
int getD() {return d;}
foo() {d=c;} //c为基类私有成员,不可见,所以不能直接用c赋值给d;
foo() {d=getC();} //getC()为基类公有部分,可以用这种方法把c的值赋给d;
int f(int, int){cout<<d<<endl;} //派生类的f(int, int)覆盖了基类的f(int, int);
};
C c1; c1.f(int, int); //输出c的值;
D d1; d1.f(int, int); //输出d的值;
d1.C::f(int, int); //输出c的值;
C* pc=&c1; pc->f(int, int); //输出c的值;
D* pd=&d1; pd->f(int, int); //输出c的值;
B类成员不能直接访问funcA(),只能通过funcB()来访问funcA()。
★子类可以定义一个和基类同名、同参数、同返回值的成员函数,派生类会覆盖基类函数,覆盖(overrides)是一类特殊的重载。
★由C类派生出D类,C类自身无任何变化。
例:
C c1; c1.f(int, int); //输出c的值;
D d1; d1.f(int, int); //输出d的值;
C* pc=&c1; pc->f(int, int); //输出c的值;
D* pd=&d1; pd->f(int, int); //输出c的值;
★由于子类会继承基类部分,想调用基类必须使用域作用运算符。
例:
d1.C::f(int, int); //输出c的值;
★继承的写法:
例:
class Derived:public Base
{
};
★保护(protected):一个类的保护成员只能被他的成员函数和友元函数访问,不能被别人访问。一个类的保护部分不能被子类对象访问,只能通过成员函数访问。【在公有继承的情况下,基类的保护成员可以被子类的成员函数访问。】
例:
class Base
{
private:
int a1;
public:
int a2;
protected:
int a3;
};
class D:public Base
{
public:
print(){
cout<<a1<<endl; //error;
cout<<a2<<endl; //ok;
cout<<a3<<endl; //ok;
}
};
D d; d.a1 //error;
d.a2 //ok;
d.a3 //error;
★★★三种继承方式:
●基类成员的访问权限在子类里只能维持原样或者降低,不能提升。
①公有继承:(最常使用)派生类的基类部分权限不变;
例:
class Derived : public Base{};
②私有继承:派生类的基类部分都是私有;
例:
class Derived : private Base{};
③保护继承:派生类的基类部分的公有成员和保护成员为保护成员,私有部分权限不变(还是私有);
例:
class Derived : protected Base{};
一重继承:一个父类一个子类;
多重继承:一个爷爷类,一个父类,一个子类或者更多。
▲子类中继承来的基类部分的私有不能直接被子类访问,但是通过私有继承变成私有的可以被子类访问。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。