C++ protected friend 继承

来源:互联网 发布:java编程思想电子书 编辑:程序博客网 时间:2024/05/22 04:31

protected专门就是为继承(子类)设计的
用public继承 那么基类所有的访问标识在子类不变
protected还是protected
protected只有类本身 和类的子类可以访问,对象是无法访问的! 除了在继承上 他跟private没有任何区别!
private 子类也将不能访问!
只是在继承上不同 其他都一样的private无法继承 也就是说子类也不能用基类的 private…但是protected就是可以的~明白吗? pravite 只对本类生成的对象内部可见,当继承以后,子类是无法访问的,比如基类有一个变量int a,是private,你想这个变量在子类还是存在的话,就需要自己再显式的定义一个private的int a,
但 protected 对本类和继承类可见,即父类定义一个int a 了以后,如果是protected的,那么其自己可以访问,并且继承的子类也会有这个变量,并且子类也是可以访问的

friend关键字,一般放在类的public下,表示用friend修饰的函数或者类,能够访问该类下的除了public以外的protected或者private变量,friend的friend不是friend,除非显式的指定,另外,关于继承后的friend属性,应该是保留的,即派生类中保留父类中的friend(这条没有验证过)。

如果方法是通过引用或者指针而不是对象调用,virtual关键字将确定使用哪种方法(基类或者派生类的方法)。如果没有使用关键字virtual,程序将根据引用类型或指针类型选择方法,如果使用了virtual,程序将根据引用或者指针指向的对象类型来选择方法。
例如,有一个基类Brass和派生类BrassPlus,如果在Brass中有一个非虚函数ViewAcct(),那么在如下调用中:

Brass brass;BrassPlus brassplus;Brass & r1_brass = brass;Brass & r2_brass = brassplus;//将上面的引用换成指针是一样的调用效果,如果ViewAcct方法加上了关//键字virtual,那么下面第二个就是调用BrassPlus::ViewAcctr1_brass .ViewAcct();  //调用Brass::ViewAcctr2_brass .ViewAcct();  //调用Brass::ViewAcct

另外,对于上面的函数,如果在子类方法中要调用基类的方法,比如要调用基类的virtual方法ViewAcct方法,那么应该加上Brass::ViewAcct,用作用域解析运算符来指定,而如果父类有函数balancec,而子类没有,且父类的该函数又没有加上virtual关键字,那么在子类中调用该函数的时候就不需要加上作用域解析运算符

需要注意的是,如果使用基类指针指向子类的对象,那么该指针只能够调用在基类存在的相应的函数或者变量,如果函数前面加上了virtual,那么该指针就指向子类的函数,如果函数没有加,那么就指向基类的该函数,如果要用该指针指向子类自己定义的函数,而不是继承的函数,那么就会报错!即,父类的指针,只能够指向子类的多态实现。但是,子类自定义的函数,可以通过子类继承的函数中来调用

关于派生类中初始化父类的构造函数,如果在子类中的构造函数不显式的调用父类的构造函数,那么子类的构造函数将调用父类的默认构造函数(就是那个不带参数的构造函数),如果父类显式的定义了其他类型的构造函数(比如带参数的构造函数),而在子类中没有显式的调用父类的那个构造函数,那么将会报错,一般情况下,最保险的情况是:
在派生类中成员初始化列表先初始化派生类的私有成员
再显式的调用基类的构造函数

派生类的析构函数是会默认调用父类的析构函数的

0 0
原创粉丝点击