C/C++ 初学简单笔记 —3— 继承与派生
来源:互联网 发布:arc map空间数据编辑 编辑:程序博客网 时间:2024/05/23 14:10
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 <iostream>
using namespace std;
class A
{
public:
virtual void show() // 如果不用virtual修饰的话,那么调用的结果是 B::show
{
cout<<"A::show"<<endl;
}
};
class B:public A
{
public:
void show() // 用virtual修饰后,就会调用这个方法,如果B中没有这个方法,那么就自动调用父类的方法。
{
cout<<"B::show"<<endl;
}
};
int main()
{
A *a = new B();
a->show();
return 0;
}
- C/C++ 初学简单笔记 —3— 继承与派生
- C++: 继承与派生
- 继承与派生(C++)
- C++:继承与派生
- C/C++——继承和派生
- C++_继承与派生
- C++_继承与派生
- C++_继承与派生
- C++_继承与派生
- 【学习C++】继承与派生
- 初学C++:继承与内嵌类
- C语言中 继承与派生
- C++----继承和派生
- 【C++】继承和派生
- C/C++ 初学简单笔记 —1—
- C/C++ 初学简单笔记 —2—
- C/C++ 初学简单笔记 —6.1 — 多线程
- C/C++ 初学简单笔记 —6.2 — 多线程
- foxmail邮件发送不成功
- [C#]將數字前面補0,補足設定的長度
- JS之模板技术(aui / artTemplate)
- 32位系统和64位系统变量所占空间总结
- ie678兼容css3
- C/C++ 初学简单笔记 —3— 继承与派生
- 配置ssh无密码登陆的错误
- OpenCV 2.4.X最常用的数据类型
- 编程挑战之三角形的内切圆与外接圆
- 【C/C++】计时函数比较
- linux sar命令详解
- ADT/Eclipse 中Graphical Layout无法显示的问题的解决
- struts2学习笔记1-strut2简介
- 48 Android ListFragment (三个布局显示)