C++类的继承
来源:互联网 发布:python 黑客 编辑:程序博客网 时间:2024/06/15 11:26
继承方式
/*默认继承方式为private
(1)public继承时
- 父类的public成员,变为子类的public成员
- 父类的protected成员,变为子类的protected成员
- 父类的private成员,变为子类不可直接使用的成员
(2)private继承时
- 父类的public成员,变为子类的private成员
- 父类的protected成员,变为子类的private 成员
- 父类的private成员,变为子类不可直接使用的成员
(3)protected继承时
- 父类的public成员,变为子类的protected成员
- 父类的protected成员,变为子类的protected成员
- 父类的private成员,变为子类不可直接使用的成员
基类的public成员,相当于派生类的private成员,无论何种继承,父类的private成员不允许子类成员访问!
!!!当父类的成员被声明为protected,则子类可以访问,而子类实例化的对象不可以访问 。
继承方式调整
class B: private A{ public: A::f1;把A中f1函数调整为public };
派生类对象的初始化
class A{ int x;public: A(){x = i;} A(int i) {x = i;} };class B: public A{ int y; public: B(int i) { y = i; } B(int i, int j):A(i) { y = j; }};B b1(1); //调用A()和B(int i) B b2(1, 2);//调用A(int)和B(int i, int j)
例子-单继承
#include <iostream>#include <string>using namespace std; class Employee { string name; int salary; public: Employee(const char *s, int n=0):name(s) { salary = n; } void set_salary(int n){salary = n;} int get_salary() const {return salary;} string get_name() const {return name;} }; const int MAX_MUN_OF_EMPS = 20; class Manager: public Employee { Employee *group[MAX_MUN_OF_EMPS]; int num_of_emps; public: Manager(const char *s, int n=0):Employee(s,n) { num_of_emps = 0; } Employee *add_employee(Employee *e) { if(num_of_emps >= MAX_MUN_OF_EMPS) return NULL; group[num_of_emps] = e; num_of_emps++; return e; } };int main(){ Employee e1("jack", 1000),e2("john", 2000); Manager m("boss", 4000); m.add_employee(&e1); cout<<m.get_name()<<endl; cout<<m.get_salary()<<endl; return 0;}
多态,动态绑定
C++中把以public方式继承的派生类看做基类的子类型。
class A;class B: public AA a, *p;B b, *q;b.f();p = &b;//父类指针可以指向派生类对象a = b;//用b对象改变a的状态,属于B但不属于A的数据忽略
- C++一般采取静态绑定,即根据已经定义的参数类型f(A *p)中A类型决定调用A中f( )。不会根据传入的参数是A,或B而动态选择调用哪个函数的f( )。实现动态绑定则需要把A类中f()函数定义为虚函数。
- 虚函数的动态绑定即,派生类中定义的相同函数对基类成员函数的重定义。只有采用指针或引用来访问对象的虚函数才进行动态绑定。
class A{ public: f();};class B: public A{ public: f();};void f(A *p){p->f();}void g(A& a){a.f();}A a;B b;f(&a);//调用A中ff(&b);//调用A中f----------class A{ public: virtual void f();};
class A{ public: virtual void f();};class B: public A{ public: void f(); void g(); };A *p = new B;p->f();p->g();//出错,A中没有g()((B *)p)->g();//可以,调用B中g B *q;q = dynamic_cast<B *>(p);// dynamic_cast转换指针p,若 A *p = new A;则转换失败返回NULL
纯虚函数和抽象类
纯虚函数只给出函数声明,没有定义,在函数原型后面加“=0”。包含纯虚函数的类定义为抽象类,抽象类不能用于创建对象,他用于给派生类提供一个基本框架和公共函数的对外接口。
class A{ public: virtual void f()=0;};
重复继承-虚基类
B、C都继承了A,所以当D继承B和C时需要合并重复的A
class B: virtual public Aclass C: virtual public Aclass D: public B, public C
阅读全文
0 0
- C++-类的继承
- C#中类的继承
- C++: 类的继承派生
- C/C++:C++类的继承
- 不能被继承的类[C/C++/C#]
- C#教程 第八课:类的继承
- C#教程第八课:类的继承
- Objective-C 类的继承、方法重载
- Objective-C 类的继承、方法重载
- objective-c语法学习:类的继承
- C语言类的继承和派生
- 【Objective-C】OC中类的继承
- obj-c编程04:类的继承
- 黑马程序员--- objective-c 类的继承
- object-c中类的继承
- 4.C++:C++类的私有继承
- C++:类继承 private, protected的区别
- 【c++】this 指针和类的继承
- Oracle 学习笔记(一)
- Xilinx网站 – 如何申请官方IP的评估license
- Reflection—Java反射机制综述和Class
- Node之cookie&session
- Android事件分发机制详解:史上最全面、最易懂
- C++类的继承
- VXworks系统开发资料
- WinCE嵌入式系统开发资料
- Eureka参数配置项详解
- Android程序崩溃处理
- 常用oracle数据库查询命令
- python通过对字典的排序,对json字段进行排序
- 一维数组
- 图的邻接矩阵存储结构基本操作的实现