C++调用同一虚拟函数的超类函数

C++ Calling a superclass function of the same virtual function

本文关键字:超类 类函数 函数 虚拟 调用 C++      更新时间:2023-10-16

我对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)认为我指的是当前类(AlarmClock子类)中的Tick()。我在网上四处查看,确定它可能需要使用using关键字,但我一直未能正确实现它。以下是我试图构建的功能以供参考:

void AlarmClock::Tick(){
    NormalClock::Clock::Tick();
    if (this->CheckAlarm()){ cout << "nAlarm! @ " << this->Print() << "nn"; }
}

如上所述调用函数时,VS中没有错误,但编译器抱怨对非静态成员的静态引用,这是可以理解的。

您很接近,但您的代码有一些问题。

  1. AlarmClock未从NormalLock继承
  2. 在AlarmClock::Tick中,调用NormalLock::Ticket()而不是NormalLock:
  3. 在NormalLock中,更改类声明中的Clock::Tick to Tick

AlarmClock不是从NormalClock派生的,因此您静态调用该方法(没有要使用的NormalClock实例)。

    NormalClock::Clock::Tick();

看起来你的意思很对。现在让您的AlarmClock实际继承自NormalClock,然后只继承NormalClock::Tick():)

谢谢大家,在类AlarmClock的定义中将基类声明更改为NormalClock看起来很简单。VS2013跳过了NormalClock类,只观察到Clock中的Tick()纯虚拟函数,这就是为什么我无法在AlarmClock::Tick()函数体中按预期调用NormalClock::Tick()