在一个虚函数的声明语句的分号前加上 =0;就可以将一个虚函数变成纯虚函数,其中,=0只能出现在类内部的虚函数声明语句处。纯虚函数只用声明,而不用定义,其存在就是为了提供接口,含有纯虚函数的类是抽象基类。我们不能直接创建一个抽象基类的对象,但可以创建其指针或者引用。值得注意的是,你也可以为纯虚函数提供定义,不过函数体必须定义在类的外部。但此时哪怕在外部定义了,也是纯虚函数,不能构建对象。
派生类构造函数只初始化它的直接基类。多继承的虚继承除外。
eg:
1 #include<iostream>
2 using namespace std; 3 //四边形
4 class Quadrilateral { 5 public: 6 virtual void print_area() = 0; 7 }; 8 //正方形
9 class Square :public Quadrilateral 10 { 11 public: 12 Square(int c):a(c){} 13 void print_area()override
14 { 15 cout << "square " << a*a << endl; 16 } 17 private: 18 int a; 19
20 }; 21 //矩形
22 class Rectangle: public Quadrilateral 23 { 24 public: 25 Rectangle(int a,int b) :R_long(a),R_width(b) 26 { 27
28 } 29 void print_area()override
30 { 31 cout << "rectangle " << R_long*R_width << endl; 32 } 33 private: 34 int R_long; 35 int R_width; 36 }; 37
38 void paly(Quadrilateral &obj) 39 { 40 obj.print_area(); 41 } 42 int main() 43 { 44 Square s1(10); 45 Rectangle r1(10, 20); 46 paly(s1); 47 paly(r1); 48
49 return 0; 50 }
这样用纯虚函数构建的抽象基类,能够为架构提供接口,如果现在要在前人代码的基础上增加一个平行四边形的面积打印,只用增加一个平行四边形的类,调用paly函数,不用再去更改原有的任何代码,而是在原有正确代码的基础上复用,这是构架的基础。纯虚函数应该在派生类中重写,否则派生类也是抽象类,不能实例化。
就像友元关系不能传递一样,友元关系同样不能继承,基类的友元在访问派生类成员时不具有特殊性,类似的,派生类的友元也不能随意访问基类的成员。