C++ 继承中的隐藏与覆盖祥解
源码:
[user:lib_hdmanage] cat example/main.cpp
/// @file main.cpp
/// @brief
/// @author EastonWoo
/// 0.01
/// @date 2013-04-23
#include <stdio.h>
#include <iostream>
class son
{
public:
son(int s,int p)
{
m_son = s;
m_pub_value = p;
};
virtual ~son(){}; //必须有,否则,无法释放。
public:
virtual void print1()
{
printf("son::print1:[m_son = %d,m_pub_value = %d]有virtual , 派生出来的类:此函数会被隐藏!\n",m_son,m_pub_value);
}
void print2()
{
printf("son::print2:[m_son = %d,m_pub_value = %d]无virtual , 派生出来的类:此函数会被覆盖!\n",m_son,m_pub_value);
}
virtual void print3()
{
printf("son::print3:[m_son = %d,m_pub_value = %d]有virtual , 派生出来的类:此函数会被隐藏!\n",m_son,m_pub_value);
}
/*
* 公有派生: 公-->公;保-->保;私-->不能访问
* 保护派生: 公-->保;保-->保;私-->不能访问
* 私有派生: 公-->私;保-->私;私-->不能访问
*/
protected:
int m_son; //protected变量,公有派生出来的是protected;
int m_pub_value;
};
class father: public son
{
public:
father(int s, int p1, int f, int p2) : son(s,p1)
{
m_father = f;
m_pub_value = p2;
};
virtual ~father(){};
public:
virtual void print1()
{
printf("father::print1:[m_son = %d,m_father = %d,m_pub_value = %d]\n",\
m_son,m_father,m_pub_value);
}
virtual void print2()
{
printf("father::print2:[m_son = %d,m_father = %d,m_pub_value = %d]\n",\
m_son,m_father,m_pub_value);
}
private:
int m_father;
protected:
int m_pub_value;
};
int main()
{
printf("*****************************************\n");
son s(1,2);
s.print1();
s.print2();
s.print3();
printf("*****************************************\n");
father f(1,2,10,20);
f.print1();
f.print2();
f.print3();
printf("*****************************************\n");
son* pS1 = new son(1,2);
pS1->print1();
pS1->print2();
pS1->print3();
if(pS1)delete pS1;
printf("*****************************************\n");
father* pF1 = new father(1,2,10,20);
pF1->print1();
pF1->print2();
pF1->print3();
if(pF1)delete pF1;
printf("*****************************************\n");
son* pSS = new father(1,2,10,20);
pSS->print1();
pSS->print2(); //特别注意这个.
pSS->print3();
if(pSS)delete pSS;
return 0;
}
运行结果:
[user:lib_hdmanage] ./example/main.i386.elf
*****************************************
son::print1:[m_son = 1,m_pub_value = 2]有virtual , 派生出来的类:此函数会被隐藏!
son::print2:[m_son = 1,m_pub_value = 2]无virtual , 派生出来的类:此函数会被覆盖!
son::print3:[m_son = 1,m_pub_value = 2]有virtual , 派生出来的类:此函数会被隐藏!
*****************************************
father::print1:[m_son = 1,m_father = 10,m_pub_value = 20]
father::print2:[m_son = 1,m_father = 10,m_pub_value = 20]
son::print3:[m_son = 1,m_pub_value = 2]有virtual , 派生出来的类:此函数会被隐藏!
*****************************************
son::print1:[m_son = 1,m_pub_value = 2]有virtual , 派生出来的类:此函数会被隐藏!
son::print2:[m_son = 1,m_pub_value = 2]无virtual , 派生出来的类:此函数会被覆盖!
son::print3:[m_son = 1,m_pub_value = 2]有virtual , 派生出来的类:此函数会被隐藏!
*****************************************
father::print1:[m_son = 1,m_father = 10,m_pub_value = 20]
father::print2:[m_son = 1,m_father = 10,m_pub_value = 20]
son::print3:[m_son = 1,m_pub_value = 2]有virtual , 派生出来的类:此函数会被隐藏!
*****************************************
father::print1:[m_son = 1,m_father = 10,m_pub_value = 20]
son::print2:[m_son = 1,m_pub_value = 2]无virtual , 派生出来的类:此函数会被覆盖!
son::print3:[m_son = 1,m_pub_value = 2]有virtual , 派生出来的类:此函数会被隐藏!