C++中的几个关键概念的理解:
1、类继承限定符:包括public、protected、private、virtual
其中采用public限定符,表示”is a“关系,比如:student is a person,即是:class student (derived class) is a class person (base class),这个”is a“关系告诉我们,base class中的所有public作用域的成员函数在derived class中要么全部被重新定义,要么就完全不定义而直接使用基类的成员函数,因为derived class是base class的特例化,就应该对重新定义的成员函数拥有不同的意义,尽管基类和派生类成员函数名称相同。因此,基于这个理论,带来了条款33。
2、类成员函数限定符包括virtual、pure virtual和non-virtual 3种类型,首先说明对其的理解:
(1)virtual声明的成员函数的主要作用:主要是实现基类base class对象能访问派生类derived class对象的特性,根据C++的数据访问规则,C++不能直接访问数据成员,只能通过成员函数访问。因此,本质上是通过vptr实现成员函数的动态绑定。其也是实现接口与实现分离的关键技术之一。
(2)pure virtual成员函数的主要作用:拥有pure virtual的成员函数一般是abstract class抽象基类,abstract class不能实例化,只能定义指针,从而实现abstract class(一般是接口类)与derived class的动态绑定。
(3)non-virtual成员函数的主要作用:如果是public或protected作用域,则其调用只能是本级class或者其derived class可以调用。基类是不能调用的。
3、上述1和2的概念必然带来几个问题:
(1)如果class B : public A时,如果class A的public中含有virtual、pure virtual、non-virtual成员函数,且其中的同名函数被重载,函数的作用域怎么改变。首先,B未重新定义A的任何函数,则可以直接调用。第2,如果B重新定义了重载的某一个函数,则根据is a规则,其他未被重载的同名函数均不可见,此时可以使用using basename:: funcname的方式将基类其它重载的同名函数作用域扩展到派生类中。
(2)由于using basename:: funcname是一个函数族的概念,我们并不希望全部扩增这些函数但又希望使用其中的某几个成员函数功能,可以用转交函数这样实现:class B : private A,注意是private继承,在B中声明一个成员函数f1(),其定义是
virtual void f1(){
Base::f1();
}
希望这些肤浅的理解,能给你也给我自己带来对C++更深的理解。