献给我最爱的笨笨
C++面向对象三个主要特征:封装、继承与多态。而继承机制是实现对象多态的基础。
另外,C++支持多重继承(即可以有多个父类),这也是许多人诟病所在。
(以下程序均在Windows7,VS2010环境下测试通过)
1)关于父类的私有成员
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
class Super{
public:
Super(){m_str="super";}
void SuperPublicShow(){SuperPrivateShow();}
private:
void SuperPrivateShow(){cout<<m_str<<endl;}
string m_str;
};
class Sub:public Super{
public:
Sub(){}
// void ShowSuperPrivate(){cout<<m_str<<endl;}//父类私有成员无法访问
// void CallSuperPrivate(){SuperPrivateShow();}//父类私有成员无法访问
void CallSuperPublic(){SuperPublicShow();}//间接访问父类私有成员
};
int main(){
Sub obj;
obj.SuperPublicShow(); //父类共有成员,继承后仍可访问
// obj.SuperPrivateShow(); //父类私有成员无法访问
// obj.ShowSuperPrivate();
obj.CallSuperPublic();
// obj.CallSuperPrivate();
return 0;
}
多啰嗦一句:类的私有成员的访问器和修改器很重要,即使当前类使用不到,考虑到以后类的扩展,至少要定义一组受保护的访问器和修改器。
另外,请大家思考一下类Super中SuperPublicShow()方法为什么可以调用SuperPrivateShow(),要看清楚它们声明与定义的次序。
2)类族中的函数重载?
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
class Super{
public:
Super(){m_str="super";}
void ShowString(){cout<<m_str<<endl;}
private:
string m_str;
};
class Sub:public Super{
public:
Sub(){}
void ShowString(string s){cout<<s<<endl;}
};
int main(){
Sub obj;
obj.ShowString("With Parameter");//调用子类函数
//obj.ShowString();//调用父类函数
return 0;
}
子类中的函数名与父类中的相同则隐藏父类成员。(要搞清楚覆盖与隐藏的区别)
以上讨论只针对公有继承,且暂时不考虑虚函数