1. 继承方式有: private, protected, public (3p,美国佬就是重口味)
继承的权限是向下的。
用public 继承,则基类成员原有权限保持不变
用protected继承,则public的都变为protected。protected和private的成员权限不变
用private继承,则全部都变为private。
注:没写继承方式,默认为 private
2. 子类调用父类方法
B b; // class B:public A
b.A::show(); // 在show前面加上域运算符,表示是调用哪个父类的成员方法
3.虚基类,就是为了解决C++中,共同基类多级多脉同名成员的处理。
假设
class A; // 有共有成员 n
class B:public A
class C:public A
class T:public B, public C // B,C有共同基类
T t;
t.n; // 出错,因为B中有n, C中也有n, 编译器不知道该怎么读取。
解决办法
class B:virtual public A
class C:virtual public A // virtual 只对紧跟其后的基类起作用。
这样的话,就相当于将共同的基类虚拟化了。
只有最底层的派生类对虚基类构造函数进行调用,而别的类则不对虚基类构造函数进行调用
声明为虚基类的作用就是为了使基类只进行一次实例化。
注意:在虚基类中,子类必须提供虚基类的初始化列表,若没,则调用默认构造函数。
4. 类的赋值兼容规则,其实就是父类声明,子类对象。
class A;
class B:A
B b;
A a = b;
A *pa = &b; // 指针只会指向原基类的成员组地址,然后赋值给父类
A &aa = b; // 注意:只能是子类赋值给父类,而不能父类赋值给子类
以上声明,实际上就是将子类中继承的原基类成员赋值给父类,所以父类自然只能访问自己的成员,而不能去访问子类的成员。
若要访问基类成员,则必须将父类声明强制转换为子类类型才可以。
(B)(a);
(B*)(pa);
(B&)(aa); // 转换为子类类型后,就能访问子类的成员了。
5. 虚函数,就是为了解决类的赋值兼容中,父类能够直接调用子类的方法。
在基类的成员函数前用virtual修饰,表明如果子类有了方法A,那么就调用子类的相应方法,如果子类没有,最后才调用父类的成员方法A。
检测测试代码
#include
using namespace std;
class A
{
public:
virtual void show() // 如果不用virtual修饰的话,那么调用的结果是 B::show
{
cout<<"A::show"<
};
class B:public A
{
public:
void show() // 用virtual修饰后,就会调用这个方法,如果B中没有这个方法,那么就自动调用父类的方法。
{
cout<<"B::show"<
};
int main()
{
A *a = new B();
a->show();
return 0;
}