继承的概念
类之间的两大关系:组合和继承:
- 组合关系的特点:
- 将其它类的对象作为自己的成员使用
- 当前类的对象与成员对象的声明期相同
- 成员对象在用法上与普通对象完全一致
组合关系的代码示例:
class Memory
{
public:
Memory()
{
cout << "Memory()" << endl;
}
~Memory()
{
cout << "~Memory()" << endl;
}
};
class Disk
{
public:
Disk()
{
cout << "Disk()" << endl;
}
~Disk()
{
cout << "~Disk()" << endl;
}
};
class Computer
{
Memory mMem;
Disk mDisk;
public:
Computer()
{
cout << "Computer()" << endl;
}
~Computer()
{
cout << "~Computer()" << endl;
}
};
-
继承(父子关系):
- 子类拥有父类的所有属性和行为
- 子类就是一种特殊的父类
- 子类对象可以当做父类对象使用
- 子类中可以添加父类没有的方法和属性
-
C++中通过下面的方式描述继承关系
class Parent
{
int mv;
public:
void method() {};
};
class Child: public Parent // 描述继承关系
{
};
- 重要规则:
- 子类就是一个特殊的父类
- 子类对象可以直接初始化父类对象
- 子类对象可以直接赋值给父类对象
继承关系代码示例:
#include <iostream>
#include <string>
using namespace std;
class Parent
{
int mv;
public:
Parent()
{
cout << "Parent()" << endl;
mv = 100;
}
void method()
{
cout << "mv = " << mv << endl;
}
};
class Child : public Parent
{
public:
void hello()
{
cout << "I'm Child calss!" << endl;
}
};
int main()
{
Child c;
c.hello();
c.method();
return 0;
}
继承的访问级别
-
根据面向对象理论:
- 子类拥有父类的一切属性和行为
- 子类能够直接访问父类的私有成员
-
根据C++语法:
- 外界不能直接访问类的private成员
- 子类不能直接访问父类的私有成员
举一个例子:
class Parent
{
private:
int mv;
public:
Parent()
{
mv = 100;
}
int value()
{
return mv;
}
};
class Child : public Parent
{
public:
int addValue(int v)
{
//子类直接访问父类的私有成员变量
mv = mv + v;
}
};
int main()
{
return 0;
}
运行结果如下:
nethanhandeMacBook-Pro-2:代码 nethanhan$ g++ 44-1.cpp
44-1.cpp:27:9: error: 'mv' is a private member of 'Parent'
mv = mv + v; // 子类直接访问父类的私有成员变量
^
44-1.cpp:9:9: note: declared private here
int mv;
^
44-1.cpp:27:14: error: 'mv' is a private member of 'Parent'
mv = mv + v; // 子类直接访问父类的私有成员变量
^
44-1.cpp:9:9: note: declared private here
int mv;
^
2 errors generated.
结果里说到 mv 是一个私有成员变量,在子类中不能直接私有成员。所以需要使用另外一个关键字 protested
。
- 关键字
protected
的意义:- 修饰的成员不能被外界直接访问
- 修饰的成员可以被子类直接访问
- 没有protected就无法完成真正意义上的代码复用
使用示例:
class Parent
{
//这里使用关键字 protected来声明
//子类就可以直接访问到
//而且外界不可以直接访问到
protected:
int mv;
public:
Parent()
{
mv = 100;
}
int value()
{
return mv;
}
};
class Child : public Parent
{
public:
int addValue(int v)
{
//子类可以直接使用父类的成员变量
mv = mv + v;
}
};
继承方式
- C++中支持三种不同的继承方式
-
public
继承- 父类成员在子类中保持原有访问级别
-
private
继承- 父类成员在子类中变为私有成员
-
protected
继承- 父类中的公有成员变为保护成员,其它成员保持不变
-
- C++中的默认继承方式为private
- 继承方式比较
继承方式\父类成员访问级别 | public | protected | private |
---|---|---|---|
public | public | protected | private |
protected | protected | protected | private |
private | private | private | private |
注意:
- 一般而言,C++工程项目中只使用public 继承
- C++的派生语言只支持一种继承方式(public 继承)
- protected 和 private 继承带来的复杂性远大于实用性
网友评论