继承:
内存空间:
子类继承父类后,成员在内存空间分布为:先父类成员后子类成员
构造析构顺序:
构造:先父后子
析构:先子后父
隐藏:
父类和子类中中同名的函数存在互为隐藏的关系,要想使用父类需要显示指定父类类名作用域。
若子类无对应的函数参数列表,则父类被隐藏
class CFather {
public:
void fun(/* CFather* const this */int a, int b) {
cout << __FUNCTION__ << " " << a << " " << b << endl;
cout << this << endl;
}
};
class CSon : public CFather {
public:
//void fun() {
// cout << __FUNCTION__ << endl;
//}
//void fun(int a) {
// cout << __FUNCTION__ << " " << a << endl;
//}
};
CSon son;
son.fun(10, 20);
CFather* const pthis = &son;
当子类函数名与父类函数名相同时,子类的函数将父类函数隐藏,不能使用父类的函数
::*是c++的整体操作符,作用是定义类成员函数指针
.* 通过对象调用类成员函数指针指向的函数
类成员函数指针:
普通的函数指针:
cout << pthis << endl;
//测试:父类指针指向子类的地址和父类中函数成员自身的this指针指向的地址相同。
::*
是
c++
的整体操作符,作用是定义类成员函数指针
.*
通过对象调用类成员函数指针指向的函数
类成员函数指针:
普通的函数指针:
void fun()
{
cout<<__FUNCTION__<<endl;
}
void (*p_fun)()=&fun();
(*p_fun)();
typedef void(*P_FUN)();
P_FUN p_fun1=&fun;
(*p_fun1)();
类成员函数指针:
class CTest {
public:
void fun(/* CTest * const this */) {
cout << __FUNCTION__ << endl;
}
};
void (CTest::*p_fun3) () = &CTest::fun;
(tst .* p_fun3)();
CTest* pTst = new CTest;
(pTst->*p_fun3)();
父类指针调用子类对象:
class CFather {
public:
};
class CSon : public CFather {
public:
void fun() {
cout << __FUNCTION__ << endl;
}
};
CFather* pFa = new CSon;
//pFa->fun();
//-------------------------------
void(CFather :: * p_fun)() = (void(CFather :: * )())&CSon::fun;
(pFa->*p_fun)();