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

Posted

技术标签:

【中文标题】C++调用同一个虚函数的超类函数【英文标题】:C++ Calling a superclass function of the same virtual function 【发布时间】:2015-02-06 20:50:31 【问题描述】:

我对 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 继承的,因此不能使用范围规则,因为它们并没有以正确的方式真正相关。如果AlarmClock did 继承自 NormalClock 你可以简单地做例如NormalClock::Tick(); 在 C++ 中,“超类”通常称为“基类”。 【参考方案1】:

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

    AlarmClock 不继承 NormalClock 在 AlarmClock::Tick 中调用 NormalClock::Tick() 而不是 NormalClock::Clock::Tick() 在 NormalClock 中,将类声明中的 Clock::Tick 更改为 Tick。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:
    NormalClock::Clock::Tick();

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于C++调用同一个虚函数的超类函数的主要内容,如果未能解决你的问题,请参考以下文章

关于C++的虚函数在父类的内部调用

C++虚函数

c++ 中如何调用基类的虚函数?

c++ 虚函数 如何调父类 而非子类

C++在构造函数中调用最终的虚函数

探索c++虚函数表