标签:
继承是一个具化的过程,父类的范围更大,子类的范围更小,父类时一个更广泛的概念,子类是一个更具体的概念。
注意:在继承时有三种继承方式,分别是public ,protected ,private.
public 的继承方式,成员在父类中的访问权限是什么样的,在子类中还是什么样的,
1 class Base 2 { 3 public: 4 int x;//在Base中是public,在Derived类中还是public 5 protected: 6 int y;//在Base中是protected,在Derived类中还是protected 7 private: 8 int z;//在Base中是private,在Derived类中还是private 9 }; 10 11 class Derived :public Base 12 { 13 14 15 };
protected 的继承,在基类中的public和protected ,继承到子类中都protected, private的成员继承到子类中还是private
1 1 class Base 2 2 { 3 3 public: 4 4 int x;//在Base中是public,在Derived类中还是protected 5 5 protected: 6 6 int y;//在Base中是protected,在Derived类中还是protected 7 7 private: 8 8 int z;//在Base中是private,在Derived类中还是private 9 9 }; 10 10 11 11 class Derived :protected Base 12 12 { 13 13 14 14 15 15 };
private继承,无论基类成员的访问权限是什么,在派生类中都是private
1 class Base 2 { 3 public: 4 int x;//在Base中是public,在Derived类中还是private 5 protected: 6 int y;//在Base中是protected,在Derived类中还是private 7 private: 8 int z;//在Base中是private,在Derived类中还是private 9 }; 10 11 class Derived :public Base 12 { 13 14 15 };
类接口:类中的共有的(public)成员函数称为接口
在公有继承中,基类的public成员函数被继承到派生类,还是public的,换句话说,基类的接口被继承到了派生类,成为了派生类的接口,故公有继承也称作接口继承。
在非公有继承中,基类的接口被继承到派生类,但是在派生类中的访问权限是,protected,或是private的,不再是类的接口,派生类只是想重用基类的实现而已,故非公有继承被称作实现继承。
在继承中,会出现隐藏,就是子类中的函数,会对基类中的同名函数进行隐藏,但是要注意,子类中对基类的同名函数隐藏。当基类中的函数不是虚函数时,可以通过在子类中对同名的函数修改参数,或者返回值来隐藏基类中的函数,但是基类中的函数是虚函数,就不能仅仅修改返回值了,还要修改参数。
#include<iostream> #include<string> using namespace std; class Base { public: int m_X; void print()const { cout << "Base::m_X:" << m_X << endl; } }; class Derived :public Base { public: int m_X; void print(int)const { cout << "Derived::m_X:" << m_X << endl; } int print(int ,int) { } int print()const//这里要特别注意,基类中的返回值是void,而这个子类中的函数只改变了基类的返回值,因为基类中的void print()const;函数不是虚函数,所以不会报错,如果基类中的void print()const函数是虚函数,这里就会报错。当然如果不想程序报错,就把参数也修改了 { } }; int main() { Derived d; int a=0; d.m_X = 10; //d.print(); //Error:这样会出现错误,Derived::print()函数不接受0个参数 //说明,Derived类中的print(int)函数把积累中的基类中的print()给隐藏了。 d.print(a); d.Base::m_X = 100;//因为子类中含有和基类成同名的成员变量和成员函数,故把基类中的成员变量和成员函数给隐藏了 d.Base::print();//但是,基类中的成员变量和成员函数还是被继承到了子类中,所以通过特殊的方法函数可以访问基类的 //成员变量和成员函数 return 0; }
标签:
原文地址:http://www.cnblogs.com/cplinux/p/5770739.html