从java转向c++了,发现c++的面向对象并不那么彻底。
对几个特性做以下总结。
友元函数
友元函数是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。
友元关系不具对称性。即 A 是 B 的友元,但 B 不一定是 A 的友元。 友元关系不具传递性。即 B 是 A 的友元,C 是 B 的友元,但是 C 不一定是 A 的友元。
作用及特点。
友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员。c++中的友元为封装隐藏这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视内部的秘密。
友元关系不具对称性。即 A 是 B 的友元,但 B 不一定是 A 的友元。 友元关系不具传递性。即 B 是 A 的友元,C 是 B 的友元,但是 C 不一定是 A 的友元。
作用及特点。
友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员。c++中的友元为封装隐藏这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视内部的秘密。
虚函数
在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,virtual 函数返回类型 函数名(参数表) {函数体;},实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。
//
// main.cpp
// VirtualDemo
//
// Created by demacia on 14-7-7.
// Copyright (c) 2014年 demacia. All rights reserved.
//
#include <iostream>
using namespace std;
class Cshape{
public:
void setColor(int color){
m_nColor=color;
}
virtual void Display(void){
cout<<"Cshape"<<endl;
}
private:
int m_nColor;
};
class Crectangle:public Cshape{
public:
virtual void Display(void){
cout<<"Crectangle"<<endl;
}
};
class Ctriangle:public Cshape{
public:
virtual void Display(void){
cout<<"Ctriangle"<<endl;
}
};
class Cellipse:public Cshape{
public:
virtual void Display(void){
cout<<"Cellipse"<<endl;
}
};
int main(int argc, const char * argv[])
{
// insert code here...
Cshape mChape;
Crectangle mCrectangle;
Ctriangle mCtriangle;
Cellipse mCellipse;
Cshape *pShape[4]={&mChape,&mCrectangle,&mCtriangle,&mCellipse};
for(int i=0;i<4;i++){
pShape[i]->Display();
}
Cshape mShape[4]={mChape,mCrectangle,mCtriangle,mCellipse};
for(int i=0;i<4;i++){
mShape[i].Display();
}
return 0;
}
注意:此处指针引用才能实现多态
内联函数
内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。