简单继承
继承是C++的特性,它可以创建一个类,继承一个已知的类,派生类自动拥有了基类的成员。继承的形式如下:
class derived_class_name: public base_class_name
{ /*...*/ };
其中public表示继承方式,可以替代为protected和private,如果省略继承方式,对'class'将采用私有继承,对'struct'将采用公有继承。
示例代码如下:
// derived classes
#include <iostream>
using namespace std;
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b;}
};
class CRectangle: public CPolygon {
public:
int area ()
{ return (width * height); }
};
class CTriangle: public CPolygon {
public:
int area ()
{ return (width * height / 2); }
};
int main () {
CRectangle rect;
CTriangle trgl;
rect.set_values (4,5);
trgl.set_values (4,5);
cout << rect.area() << endl;
cout << trgl.area() << endl;
return 0;
}
protected修饰符类似private,唯一不同是,继承的时候,当一个类从另一个类继承,派生类中的成员可以访问受保护的从基类继承的成员,但不是它的私有成员。
根据访问方式,我们可以总结出下面的访问类型:
Access | public | protected | private |
---|---|---|---|
members of the same class | yes | yes | yes |
members of derived classes | yes | yes | no |
not members | yes | no | no |
三种继承方式
之前提到继承方式,分别有:公有继承(public)、私有继承(private)、保护继承(protected)。
1. 公有继承(public)
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。
2. 私有继承(private)
私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
3. 保护继承(protected)
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。
继承的成员
原则上,派生类不会继承基类的以下成员:
1.基类的构造和析构函数
2.基类的=()成员函数
3.基类的友元
虽然基类的构造函数和析构函数没有被继承,一个派生类的新对象被创建或销毁时总是会调用基类的默认构造函数(即,它不带参数的构造函数)和它的析构函数。
如果基类没有默认构造函数,一个重载的构造函数被调用创建一个新的派生对象时,您可以在每个派生类的构造函数中定义:
derived_constructor_name (parameters) : base_constructor_name (parameters) {...}
例如:
// constructors and derived classes
#include <iostream>
using namespace std;
class mother {
public:
mother ()
{ cout << "mother: no parameters\n"; }
mother (int a)
{ cout << "mother: int parameter\n"; }
};
class daughter : public mother {
public:
daughter (int a)
{ cout << "daughter: int parameter\n\n"; }
};
class son : public mother {
public:
son (int a) : mother (a)
{ cout << "son: int parameter\n\n"; }
};
int main () {
daughter cynthia (0);
son daniel(0);
return 0;
}
多继承
C++支持一个类继承多个类,例如
class CRectangle: public CPolygon, public COutput;
class CTriangle: public CPolygon, public COutput;
完整例子如下:
// multiple inheritance
#include <iostream>
using namespace std;
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b;}
};
class COutput {
public:
void output (int i);
};
void COutput::output (int i) {
cout << i << endl;
}
class CRectangle: public CPolygon, public COutput {
public:
int area ()
{ return (width * height); }
};
class CTriangle: public CPolygon, public COutput {
public:
int area ()
{ return (width * height / 2); }
};
int main () {
CRectangle rect;
CTriangle trgl;
rect.set_values (4,5);
trgl.set_values (4,5);
rect.output (rect.area());
trgl.output (trgl.area());
return 0;
}