C++的继承实现之公有继承

  • 公有继承
class Base
{
   //...base class members   
};
class Derived : access-specifier Base
{
   //..derived class members
};

其中的access-specifier 可以是public,private,或是protected.

与public和private一样,protected也是一个访问限定符。将属性声明为protected的时,相当于允许派生类和友元类访问它,但禁止在继承层次结构外部(包括main( ))访问它。使用protected关键字,只有派生类和友元类才能访问。

包含初始化列表的派生类构造函数:

#include<iostream>
using namespace std;
class Fish
{
protected:
    bool isFreshWaterFish;
public:
    Fish(bool isFreshWater):isFreshWaterFish(isFreshWater){}

    void Swim()
    {
        if(isFreshWaterFish)
            cout<<"Swims in lake"<<endl;
        else
            cout<<"Swims in sea"<<endl;
    }
};

class Tuna:public Fish
{
public:
    Tuna():Fish(false){}//constructor initializes base
};
int main()
{
    Tuna myDinner;
    cout<<"Dinner :";
    myDinner.Swim();
    return 0;

}
运行的结果

如果派生类实现了从基类继承的函数,且返回值和特征标相同,就相当于覆盖率基类的这个方法。

#include<iostream>
using namespace std;
class Fish
{
protected:
    bool isFreshWaterFish;
public:
    Fish(bool isFreshWater):isFreshWaterFish(isFreshWater){}

    void Swim()
    {
        if(isFreshWaterFish)
            cout<<"Swims in lake"<<endl;
        else
            cout<<"Swims in sea"<<endl;
    }
};

class Tuna:public Fish
{
public:
    Tuna():Fish(false){}//constructor initializes base
    void Swim()
    {
        cout<<"Tuna swims real fast"<<endl;
    }
};
int main()
{
    Tuna myDinner;
    cout<<"Dinner :";
    myDinner.Swim();
    return 0;

}
在派生类中覆盖基类的方法

此时,派生类实例化的对象调用Swim()方法,调用的是在派生类里面的Swim()方法。在派生类中调用基类的办法:用作用域解析运算符(::)可以调用基类中的方法。

在实例中调用已经被隐藏的基类方法:

1. 在main()函数中使用作用域解析运算符:

myDinner.Fish::Swim();

2.在派生子类中,使用关键字using解除对于基类方法的隐藏:

class Tuna: public Fish
{
public:
    using Fish::Swim;
    void Swim ()
    {
        cout<<" "<<endl;
    }
};

3.通过派生子类的Swim()方法,来调用基类中的Swim()方法:

class Tuna:public Fish
{
public:
    Tuna():Fish(false){}//constructor initializes base
    void Swim(isFreshWaterFish)
    {
        Fish::Swim(isFreshWaterFish);
    }
    void Swim()
    {
        cout<<"Tuna swims real fast"<<endl;
    }
};

接下来的程序说明了在类实例化构造对象的时候,构造函数调用的顺序,以及析构函数调用的顺序:

#include<iostream>
using namespace std;
class FishDummyMember
{
public:
    FishDummyMember()
    {
        cout<<"FishDummyMember constructor"<<endl;
    }
    ~FishDummyMember()
    {
        cout<<"FishDummyMember destructor"<<endl;
    }
};
class Fish
{
protected:
    FishDummyMember dummy;
public:
    Fish()
    {
        cout<<"Fish constructor"<<endl;
    }
    ~Fish()
    {
        cout<<"Fish destructor"<<endl;
    }
};
class TunaDummyMember
{
public:
    TunaDummyMember()
    {
        cout<<"TunaDummyMember constructor"<<endl;
    }
    ~TunaDummyMember()
    {
        cout<<"TunaDummyMember destructor"<<endl;
    }
};
class Tuna: public Fish
{
private:
    TunaDummyMember dummy;
public:
    Tuna()
    {
        cout<<"Tuna constructor"<<endl;
    }
    ~Tuna()
    {
        cout<<"Tuna destructor"<<endl;
    }

};
int main()
{
   Tuna myDinner;
}
看看
运行的结果

从上面的结果可以看出,类在实例化对象的时候,的构造顺序和析构顺序是相反的。

猜你喜欢

转载自blog.csdn.net/qq_35353824/article/details/88709376