C++笔记:面向对象编程基础

时间:2014-03-18 11:51:26   收藏:0   阅读:438

面向对象编程基础

面向对象编程基于三个基本概念:


面向对象编程概述

面向对象编程的关键思想是多态性(polymorphism)。多态性派生于一个希腊单词,意思是“许多形态”,之所以称通过继承而相关联的类型为多态类型,是因为在许多情况下可以互换地使用派生类型或基类型的“许多形态”。在C++中,多态性仅用于通过继承而相关联的类型的引用或指针
在C++中,基类必须指出希望派生类重写哪些函数,定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。
在C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指对象的实际类型所定义的。
引用和指针的静态类型与动态类型可以不同,这是 C++ 用以支持多态性的基石


基类

访问控制


派生类


virtual与其他成员函数

为什么会希望覆盖虚函数机制?
最常见的理由是为了派生类虚函数调用基类中的版本。在这种情况下,基类版本可以完成继承层次中所有类型的公共任务,而每个派生类型只添加自己的特殊工作。
例如,可以定义一个具有虚操作的Camera类层次。Camera类中的display函数可以显示所有的公共信息,派生类(如PerspectiveCamera)可能既需要显示公共信息又需要显示自己的独特信息。可以显式调用Camera版本以显示公共信息,而不是在PerspectiveCamera的display实现中复制Camera的操作。 在这种情况下,已经确切知道调用哪个实例,因此,不需要通过虚函数机制。



继承

公用、私有和受保护的继承

友元关系和继承

静态成员和继承



Code

Code1:派生类只能通过派生类对象访问其基类的protected成员

/*假定 Bulk_item 定义了一个成员函数,接受一个 Bulk_item 对象的 引用和一个 Item_base 对象的引用,该函数可以访问自己对象的 protected 成 员以及 Bulk_item 形参的 protected 成员,但是,它不能访问 Item_base 形 参的 protected 成员。*/
 void Bulk_item::memfcn(const Bulk_item &d, const Item_base &b)
 {
    // attempt to use protected member
    double ret = price; // ok: uses this->price
    ret = d.price; // ok: uses price from a Bulk_item object
    ret = b.price; // error: no access to price from an Item_base
}
/*d.price 的使用正确,因为是通过 Bulk_item 类型对象引用 price;b.price 的 使用非法,因为对 Base_item 类型的对象没有特殊访问访问权限。*/

Code2:声明(但并不实现)一个派生类

//error: a forward declaration must not include the derivation list class   Bulk_item : public Item_base;
 //正确的前向声明为:
 //forward declarations of both derived and nonderived class
 class Bulk_item;
 class Item_base;

Code3:覆盖虚函数机制

Item_base *baseP = &derived;
 //calls version from the base class regardless of the dynamic type of baseP
 double d = baseP->Item_base::net_price(42);

Code4:在派生类的成员函数内部访问基类的成员,访问级别取决于基类的类型

class Base {
public:
    void basemem();
protected:
    int i;
// ... 
};

struct Public_derived : public Base {
    int use_base() { return i; } // ok: derived classes can access i
    // ...
};
struct Private_derived : private Base {
    int use_base() { return i; } // ok: derived classes can access i
};

Code5:在派生类定义与实现的外部,即派生类的对象或者继承自派生类的类,派生类成员访问级别取决于派生类继承基类的访问标号

Base b;
Public_derived d1;
Private_derived d2;
b.basemem();   // ok: basemem is public
d1.basemem();  // ok: basemem is public in the derived class
d2.basemem();  // error: basemem is private in the derived class

//派生访问标号还控制来自非直接派生类的访问:
 struct Derived_from Private : public Private_derived {
     // error: Base::i is private in Private_derived
     int use_base() { return i; }
 };
 struct Derived_from_Public : public Public_derived {
     // ok: Base::i remains protected in Public_derived
     int use_base() { return i; }
 };

Code6:派生类可以恢复继承成员的访问级别

class Base {
 public:
     std::size_t size() const { return n; }
 protected:
     std::size_t n;
 };
 class Derived : private Base { . . . };

 /*在这一继承层次中,size 在 Base 中为 public,但在 Derived 中为 private。为了使 size 在 Derived 中成为 public,可以在 Derived 的 public 部分增加一个 using 声明。如下这样改变 Derived 的定义,可以使 size 成员 能够被用户访问,并使 n 能够被从 Derived 派生的类访问:*/
 class Derived : private Base {
 public:
 // maintain access levels for members related to the size of the object
    using Base::size;
 protected:
     using Base::n;
 // ... 
};


C++笔记:面向对象编程基础,布布扣,bubuko.com

原文:http://blog.csdn.net/liufei_learning/article/details/21436035

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!