原博主博客地址:http://blog.csdn.net/qq21497936
本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78105316
C++ STL开发温习与总结(四):
4.C++面向对象机制的实现
对比与C语言的函数,C++增加了重载(Overloaded)、内联(Inline)、const和virtual四种新机制。
本篇将探究重载、内敛和virtual的优点和局限性。
1类的继承技术
对象(Object)是类(Class)的一个实例(Instance)。如果将对象比作房子,那么类就是设计房子的图纸。 对象是类的实现,类是对这一类对象的抽象。
对于C++而言,设计孤立的类是比较容易的,难的是正确设计基类及其派生类。
class A { public: voidFunc1(void); }; class B : public A { public: voidFunc2(void); } void main() { B b; b.Func1();// B从A继承了函数Func1 b.Func2(); }
此例说明了一个事实:C++的“继承”特性可以提高程序的可复用性。
1-1单继承技术
在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构。
class A { public: A(); voidAprint(); int a; protected: intaa; private: intaaa; } class B : public A { public: B(); voidBprint(); int b; protected: intbb; private: intbbb; }
访问权限说明如下:
l 类B的public函数允许访问类A的public数据成员a;
l 类B的public函数允许访问类A的projected数据成员aa;
l 类B的protected函数允许访问类A的public数据成员a;
l 类B的protected函数允许访问类A的protected数据成员aa;
l 类B的private函数允许访问类A的public数据成员a;
l 类B的private函数允许访问类A的protected数据成员aa;
l 类B的所有成员函数可以访问类B的private和protected数据成员;
l 类A的所有成员函数可以访问类A的private数据成员;
以上是数public继承方式,若是private继承,则类A对于类B来说都是private,无法访问。缺省的继承方式是private,即可不使用关键字。
1-2多继承技术
多继承可以看作是单继承的扩展,所谓多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。多继承下派生类定义的格式如下:
class<派生类名>: <继承方式1><基类名1>,<继承方式2><基类名2>,…
在多继承下,派生类的构造函数如下:
<派生类名>(<总参数表>):<基类名1>(<参数表1>),<基类名2>(<参数表2>),…
{<派生类构造函数体>}
下面是示例,使用了域操作符,解决相同函数名冲突问题
class B1 { public: … voidprint() { cout << “b1” << endl; } } class B2 { public: … voidprint() { cout << “b2” << endl; } } class A : public B1, public B2 { public: … void print() { B1::print(); B2::print(); } } void main() { A a(1,2); a.print(); }
程序输出为:
b1
b2
2函数重载技术
函数重载是指同一个函数名可以对应多个函数的实现。函数重载要求编译器能够惟一地确定调用一个函数时应执行哪个函数代码。确定函数实现时,要求从函数参数的个数和类型上来区分,否则,将无法实现重载。
3运算符重载技术
函数重载和运算符重载是简单的类多态性。所谓函数的重载简单地说就是赋值给同一个函数名多个含义。运算符重载允许C/C++的运算符在用户定义类型(类)上拥有一个用户定义的意义。
下面稍微提及以下面向程序的三大特性:
多态性是面向对象程序设计的重要特征之一,它与封装性和继承性构成了面向对象程序设计的三大特征。
封装性:把对象的成员属性和成员方法结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节。
继承性:继承性是子类自动共享父类之间数据和方法的机制
多态性:多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说:允许将子类类型的指针赋值给父类类型的指针(一个接口,多种方法)。编译时多态性(静态多态):通过重载函数实现,,运行时多态性(动态多态):通过虚函数实现,有virtual才可能发生动态多态现象,无virtual调用就按原类型调用。
重载的运算符是函数调用的语法修饰:
class Fred { public: // …}; #if 0 // 没有算符重载 Fred add(Fred, Fred); Fred mul(Fred, Fred); Fred f(Freda, Fred b, Fred c) { return add( mul(a,b), mul(b,c), mul(c,a)); ) #else // 有运算符重载 Fred operator+ (Fred, Fred); Fred operator* (Fred, Fred); Fred f(Freda, Fred b, Fred c) { return a*b+b*c+c*a; } #endif
通过重载类上的标准算符,使得用户程序所有的语言是面向问题的,而不是面向机器的,最终目标是降低学习曲线并减少错误率。几乎所有的运算符都可用作重载。具体包含:
l 算术运算符:+、-、*、/、%、++、--;
l 位操作运算符:&、|、~、^、<<、>>;
l 逻辑运算符:!、&&、||;
l 比较运算符:<,>,>=,<=,==,!=;
l 赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=;
l 其他运算符:[]、()、->、,(逗号运算符)、new、delete、new[]、delete[]、->*;
下列运算符不允许重载:“.”、“*”、“::”、“?”、“:”;
用户重载新定义运算符,不改变原运算符的优先级和结合性,也不改变运算符的结构,即单目运算符只能重载单目运算符类似的。
4纯虚函数和抽象类技术
纯虚函数是一种特殊的虚函数,它的一般格式如下:
class<类名>{ virtual <类型><函数名>()=0;… };
在许多情况下,在积累中不能对虚函数给出有意义的实现,而把它说明为纯虚函数,它的实现留给基类的派生类去做,这就是纯虚函数的作用。
带有纯虚函数的类成为抽象类。抽象类是一种特殊的类,它是为了抽象和设计的目的而简历的,它处于继承层次结构的较上层。抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。
一般来说,抽象类只描述了这组子类共同的操作接口,而完整的实现留给子类自己来完成。
抽象类只能作为基类来使用,其纯虚函数的实现是由派生类给出的。如果派生类没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类,不能使用;如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类,而是一个可以建立对象的具体类。
原博主博客地址:http://blog.csdn.net/qq21497936
本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78105316