1.代码重用
C++很重要的一个特征就是代码重用。在C语言中重用代码的方式就是拷贝代码,修改代码。C++可以用继承或组合的方式来重用。通过组合或继承现有的类来创建新类,而不是重新创建它们。
2.继承
(1)继承是使用已经编号的类来创建新类,新的类具有原有类的所有属性和操作,也可以在原有类的基础上作一些修改和增补。
(2)新类成为派生类或子类,原有类称为基类或父类。
(3)派生类是基类的具体化
(4)派生类的声明语法为:
class 派生类名 : 继承方式 基类名 {
派生类新增成员的声明;
};
3.共有,私有,保护成员
(1)在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问共有类型数据和函数。
(2)在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。
(3)在关键字protected后面声明,与private类似,其差别表现在继承与派生对派生类的影响不同。
4.共有,私有,保护继承
#include <iostream>
using namespace std;
class Base {
public:
int x_;
protected:
int y_;
private:
int z_;
};
class PublicInherit : public Base {
public:
void Test() {
x_ = 10;
y_ = 20;
//z_ = 30;
}
private:
int a_;
};
class PrivateInherit : private Base {
public:
void Test() {
x_ = 10;
y_ = 20;
//z_ = 30;
}
private:
int a_;
};
int main() {
Base base;
base.x_ = 10;
//base.y_ = 20;
//base.z_ = 30;
PublicInherit pi;
pi.x_ =10;
//pi.y_ =20;
//pi.z_ =30;
PrivateInherit pr;
//pr.x_ =10;
//pr.y_ =20;
//pr.z_ =30;
return 0;
}
5.默认继承保护级别
class Base {};
struct D1 : Base {}; // 公有继承
class D2 : Base {}; // 私有继承
6.接口继承与实现继承
(1)我们将类的公有成员函数称为接口。
(2)公有继承,基类的共有成员函数在派生类中任然是公有的,换句话说是基类的接口成为了派生类的接口,因而将它称为接口继承。
(3)实现继承,对于私有,保护继承,派生类不继承基类的接口。派生类将不再支持基类的公有接口,它希望能重用基类的实现而已,因而将它称为实现继承
7.继承与重定义
(1)对基类的数据成员重定义
(2)对基类成员函数的重定义分为两种
[1]overwrite(覆盖):与基类完全相同;与基类成员函数名相同,参数不同
[2]override(重写):virtual
#include <iostream>
using namespace std;
class Base {
public:
Base(): x_(0) {
}
int GetBaseX() const {
return x_;
}
void Show() {
cout << "Base::Show ..." << endl;
}
public:
int x_;
};
class Derived: public Base {
public:
Derived(): x_(0) {
}
int GetDerivedX() const {
return x_;
}
void Show() {
cout << "Derived::Show ..." << endl;
}
void Show(int n) {
cout << "Derived::Show(int n) ..." << endl;
}
public:
int x_;
};
class Test {
public:
Base b_;
int x_;
};
int main(void) {
Derived d;
d.x_ = 10;
d.Base::x_ = 20;
cout << d.GetBaseX() << endl;
cout << d.GetDerivedX() << endl;
d.Show();
d.Base::Show();
cout << sizeof(Derived) << endl;
cout << sizeof(Test) << endl;
return 0;
}
8.继承和组合
(1)无论是继承与组合本质都是把子对象放在新类型中,两者都是使用构造函数的初始化列表去构造这些子对象。
(2)组合是希望新类内部具有已存在的类的功能时使用,而不是希望已存在类作为它的接口。组合通过嵌入一个对象以实现新类的功能,而新类用户看到的是新定义的接口,而不是来自老类的接口。(has-a)
(3)如果希望新类与已存在的类有相同的接口(在这基础上可以增加自己的成员)。这时候需要用继承,也称为子类型化。(is-a)
class A {
public:
void FunA() {
...
}
};
class B {
public:
void FunB() {
...
a_.FunA();
...
}
private:
A a_;
};
1250

被折叠的 条评论
为什么被折叠?



