c++知识细节-派生类/调用顺序/访问等级/函数遮蔽
派生类
概念
(1) 类之间的层次关系,有父亲类,有孩子类.
例如车这个类,当做父类(也叫基类,超类),派生出卡车,轿车等孩子类(子类,派生类)
继承: 父子之间的这种层次关系焦作继承.是我们面向对象程序设计的核心.
(2) 格式:class 子类名:继承方式 父类名如: class Men : public Human 派生类对象定义时调用构造函数的方式
(1) 当定义子类对象时,会调用父类和子类的构造函数,且父类构造函数的函数体先执行,子类构造函数的函数体后执行.
(2) 如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。
构造原则如下:
①如果子类没有定义构造方法,则调用父类的无参数的构造方法。
②如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。
③在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。
④在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。
⑤在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。
⑥如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式,比如:
# include <iostream.h>
class animal
{
public :
animal ( int height, int weight)
{
cout<< "animal construct" << endl;
}
…
} ;
class fish : public animal
{
public :
fish ( ) : animal ( 400 , 300 )
{
cout<< "fish construct" << endl;
}
…
} ;
void main ( )
{
fish fh;
}
public,protected,private
三种访问权限:
public: 可以被任意实体访问
protected: 只允许本类或者子类的成员函数访问.
private: 只允许本类的成员函数访问.
三种继承访问:
public继承: 不改变父类的访问权限.
protected继承: 将父类中所有public成员变为子类的protected成员.
private继承: 父类所有成员在子类中的访问权限变为private.
Tips:
①父类中的private成员不受继承方式的影响,子类永远无法访问.
②对于父类来说,尤其是父类的成员函数,如果你不想让外边访问,就设置为private;如果你想让自己的子类能够访问,就设置为protected;如果你想公开,就设置为public. 函数遮蔽
(1) 子类中如果有一个同名函数,那么父类中不管有几个同名函数,使用子类对象都无法访问到.
(2) 如果确实想调用父类中的成员函数,
①在子类的成员函数中,用父类::函数名的方式可以强制调用.
②c++11中使用using可以让父类同名函数在子类中可见.通过using关键字,让父类同名函数在子类中以重载的方式来使用.
形如:
using Human::samenamefunc;
Tips:
如果子类和父类中同名同参,父类中此函数还是会被子类覆盖.;且父类中凡是叫这个名字的函数,在子类中就都可见了,无法单独控制.
# include <iostream>
class Human
{
public :
Human ( ) ;
Human ( int ) ;
public :
int m_age;
char m_name[ 100 ] ;
} ;
# include <iostream>
# include "Human.h"
Human :: Human ( )
{
cout << "执行了Human::Human()" << endl;
}
Human :: Human ( int abc)
{
cout << "执行了Human::Human(int)" << endl;
}
# include <iostream>
# include "Human.h"
class Men : public Human
{
public :
Men ( ) ;
public :
} ;
# include <iostream>
# include "Men.h"
Men :: Men ( )
{
cout << "执行了Men::Men()" << endl;
}