簡體   English   中英

C ++調用相同虛函數的超類函數

[英]C++ Calling a superclass function of the same virtual function

我是C ++的新手,所以我已經習慣了這種環境下函數和變量的范圍。 我無法解決的一個問題是能夠調用在類的子類中定義的函數,該類將此函數聲明為純虛函數。 這是我的課程結構:

class Clock{

    public:
        virtual void Tick() = 0;
        std::string Print();

        //Mutators
        int Seconds();
        int Minutes();
        int Hours();
        void setTime(int secs, int mins, int hours);

        //Accessors
        int getSecs(){ return _secs; }
        int getMins(){ return _mins; }
        int getHrs(){ return _hours; }
    private:
        int _secs, _mins, _hours, _days = 0;
    };

    class NormalClock : public Clock{

    public:
        void Clock::Tick();
    private:
    };

    class AlarmClock : public Clock{

    public:
        void Clock::Tick();
        bool CheckAlarm();
        void SetAlarmTime(int hrs, int mins, int secs);
        int GetAHrs();
        int GetAMins();
        int GetASecs();
    private:
        int _alarmhrs, _alarmmins, _alarmsecs;
    };

在我的源文件中,我想為AlarmClock類中的Tick()函數定義一個主體。 但是在此函數中,我想從其超類NormalClock類調用Tick()函數。 我的問題是,當我這樣做時卻沒有定義要使用的任何對象時,我無法調用超類Tick()函數,因為我的IDE(VS2013)認為我是從當前類中引用Tick()AlarmClock子類)。 我在網上四處張望,並確定它可能需要使用using關鍵字,但是我未能正確實現它。 這是我要構建的功能以供參考:

void AlarmClock::Tick(){

    NormalClock::Clock::Tick();

    if (this->CheckAlarm()){ cout << "\nAlarm! @ " << this->Print() << "\n\n"; }
}

像上面那樣調用函數時,VS中沒有錯誤,但是編譯器抱怨靜態引用了一個非靜態成員,這是可以理解的。

AlarmClock不是從NormalClock派生的,因此您是在靜態地調用該方法(沒有使用NormalClock實例)。

    NormalClock::Clock::Tick();

看起來很像是您的意思是對的。 現在,使您的AlarmClock實際上繼承自NormalClock ,然后僅NormalClock::Tick()離開:)

您很親近,但是您的代碼有一些問題。

  1. AlarmClock不會從NormalClock繼承
  2. 在AlarmClock :: Tick中調用NormalClock :: Tick()而不是NormalClock :: Clock :: Tick()
  3. 在NormalClock中,更改Clock :: Tick以在類聲明中打勾。

謝謝大家,這看起來像是在AlarmClock類的定義中將基類聲明更改為NormalClock的簡單情況。 VS2013跳過了NormalClock類,僅觀察ClockTick()純虛擬函數,這就是為什么我不能按AlarmClock::Tick()函數的主體中的預期調用NormalClock::Tick()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM