类的继承和多态

一、对继承的理解
(1)基类的构造函数和析构函数都不能被子类继承。
(2)子类中成员包括:
基类成员,子对象(基类的对象,子对象也可能不存在),新增成员
所以,派生类对象初始化时,要对上述三者都初始化。
(3)在子类的构造函数中,基类的构造函数会出现在参数初始化表中,对基类成员初始化。如:
派生类构造函数名(总参数表) : 基类构造函数名(参数表),子对象名(参数表)
{
//派生类中新增成员的初始化语句
}
(4)基类的清理工作仍然有基类的析构函数来执行。在执行完派生类的构造函数后,系统会自动调用基类的析构函数。

二、对多态的理解
(1) 区分三种情况
基类指针指向基类对象,基类指针指向派生类对象,派生类指针指向派生类对象
(2) 掌握虚函数和非虚函数
对于以上三种情况,会如何调用虚函数和非虚函数呢?具体见测试代码,附有详细注释。

具体代码如下,并在VS2010上测试通过:

#include 
using namespace std;

//测试继承与多态
class A
{
public:
    virtual void run()
    {
        cout<<"A run"<void runner()
    {
        cout<<"A runner"<void display()
    {
        cout<<"A display"<void show()
    {
        run();//虚函数被调用
    }
};

class B : public A
{
public:
    void run()
    {
        cout<<"B run"<void display()
    {
        cout<<"B display"<//a为子对象
};

//多态:基类指针指向基类对象 & 基类指针指向子类对象
// 基类指针指向子类对象,子类指针指向子类对象,虚函数都会起作用
void PolymorphicTest()
{
    A* paa = new A;
    paa->run();//调用基类中run(),与是否为虚函数无关
    paa->display();//调用基类中display()
    paa->show();//调用基类中show()
    cout<//基类指针指向派生类的对象
    pab->run();//虚函数,被子类中同名函数覆盖
    pab->display();//非虚函数,仍然调用基类中display()
    pab->show();//调用父类中show(), 由于虚函数关系,实现子类中run()
    cout<new B;
    pbb->run();//调用子类中 run()
    pbb->display();//调用子类中display()
    pbb->show();//调用父类中show(), 在show()中调用了run(), 由于虚函数关系,被子类中run()覆盖
    pbb->runner();//调用父类中runner()
}

int _tmain(int argc, _TCHAR* argv[])
{
    PolymorphicTest();
    return 0;
}

你可能感兴趣的:(c++)