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

时间:2015-02-06 20:50:31

标签: c++ inheritance subclass pure-virtual

我对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;
    };

在我的源文件中,我想为Tick()类中的AlarmClock函数定义一个主体。但是在这个函数中我想从它的超类Tick()类中调用NormalClock函数。我的问题是,当我这样做而没有定义任何可以解决的对象时,我无法调用超类Tick()函数,因为我的IDE(VS2013)认为我指的是{{1来自当前类(Tick()子类)。我浏览了网页并确定可能需要使用AlarmClock关键字,但我没有成功实施它。这是我尝试构建以供参考的功能:

using

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

4 个答案:

答案 0 :(得分:0)

AlarmClock并非来自NormalClock,因此您静态调用该方法(不会使用NormalClock的实例)。

答案 1 :(得分:0)

    NormalClock::Clock::Tick();

看起来很像你的意思是正确的。现在让你的AlarmClock实际上继承自NormalClock,然后只留下NormalClock::Tick():)

答案 2 :(得分:0)

你很亲密,但你的代码有一些问题。

  1. AlarmClock不会从NormalClock继承
  2. 在AlarmClock :: Tick中调用NormalClock :: Tick()而不是NormalClock :: Clock :: Tick()
  3. 在NormalClock中更改Clock ::在您的班级声明中勾选勾选。

答案 3 :(得分:0)

感谢大家,看起来这是在类NormalClock的定义中将基类声明更改为AlarmClock的简单情况。 VS2013正在跳过NormalClock类并仅在Tick()中观察Clock纯虚函数,这就是为什么我无法按照正文中的预期调用NormalClock::Tick() AlarmClock::Tick()函数。