C++中使用继承可以定义相似类型的类并对其相似关系建模。
1.声明基类和派生类
class A
{
...
public:
static void func();
static int number;
};
class B
{
...
};
class C: public A, protected B
{
...
};
int A::number = 10;
2.基类通常都会定义一个虚析构函数
3.基类会将成员定义为两种类型:一种是希望派生类直接继承的,在基类中直接正常声明和定义就可以;另一种是希望派生类重新定义并覆盖的,基类会将这种成员函数定义为虚函数
4.(1)构造函数和静态函数不能声明成virtual,其他函数都可以是virtual。(2)virtual关键字只能用于类声明的内部,在虚函数返回值前面,不能用在类外函数的实现处。(3)某成员函数在基类中声明为virtual后,在被派生类继承后在派生类中此函数也默认成为虚函数,无论在派生类中是否有重写此函数。
5.成员函数没被声明成虚函数,则其解析过程发生在编译阶段,虚函数的解析则发生在运行阶段
6.派生类将会继承基类的所有成员包括私有成员,但是在派生类内基类的私有成员是不可见的,有两个事实是:(1)基类内的私有数据成员增加后,使用sizeof()获取派生类的数据大小后发现所占字节增加了。(2)派生类对象可以通过基类的公有函数访问到基类的私有成员。
7.公有且只有公有派生类的对象可以绑定到基类的指针或者引用上
8.在派生类中如果没有实现覆盖基类的虚函数,则在派生类中将视此虚函数为普通函数来继承,但仍是虚函数
9.在派生类中定义构造函数时需要使用基类的的构造函数初始化基类部分的成员,再在派生类构造函数体中初始化派生类的成员,从语法上来说派生类的构造函数可以对基类部分的成员赋值,但最好不要这么做,因为我们要遵循基类接口的原则,任何对类对象的操作都要通过接口。
C::C(a,b,c):A(a),B(b),m_c(c)
{
.......
}
10.基类中如果定义了静态成员函数,则在整个继承体系中只有一个实例,也就是说所有的派生类和基类共用这一个静态函数,静态函数的访问权限遵循一般函数的访问权限(公有继承的公有或保护函数可以被派生类访问。。。。)值得一提的是一般认为派生类的作用域是基类作用域的一部分例如下列各语句都是对同一静态函数和静态变量做操作
A::func(); //正确,利用A的作用域访问静态函数
B::func(); //正确,利用B的作用域访问静态函数
A a; a.func(); //正确,利用a的对象访问静态函数
B b; b.func(); //正确,利用b的对象访问静态函数
A::number = 1; //正确,利用A的作用域访问静态成员变量
B::number = 1; //正确,利用B的作用域访问静态成员变量
A a; a.number = 1; //正确,利用a的对象访问静态成员变量
B b; b.number = 1; //正确,利用b的对象访问静态成员变量
11.基类和派生类的声明
(1)派生类的声明只包含它的类名就可以了,不能包含派生列表,因为类的声明只是让程序知道这个类的存在,至于它的细节或者是派生信息应该和类的定义在一起出现,例如:
class C : public A; //错误,声明中不能包含派生列表
class C; //正确
(2)定义一个派生类时,派生列表中的基类必须已经完成定义而不仅仅是声明,因为定义派生类时派生类必须知道基类的细节,例如
class A;
class C: