C++调用同一个虚函数的超类函数
C++ Calling a superclass function of the same virtual function
我对 c++ 比较陌生,所以我已经习惯了这个环境中函数和变量的范围。我无法解决的一个问题是能够调用在 class 的 subclass 中定义的函数,该函数将此函数声明为纯虚拟函数。这是我的 class 结构:
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
class 中的 Tick()
函数定义一个主体。但是在这个函数中,我想从它的 superclass、NormalClock
class 调用 Tick()
函数。我的问题是,当我在没有定义任何对象的情况下这样做时,我无法调用 superclass Tick()
函数,因为我的 IDE (VS2013) 认为我指的是从当前 class 到 Tick()
(AlarmClock
subclass)。我在网上四处查看,确定它可能需要使用 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()
离开 :)
你很接近,但你的代码有一些问题。
- AlarmClock 不继承自 NormalClock
- 在 AlarmClock::Tick 中调用 NormalClock::Tick() 而不是 NormalClock::Clock::Tick()
- 在 NormalClock 中,将 Clock::Tick 更改为 class 声明中的 Tick。
谢谢大家,看起来这是一个简单的例子,将 class 声明更改为 class AlarmClock
定义中的 NormalClock
。 VS2013 跳过 NormalClock
class 并仅观察 Clock
中的 Tick()
纯虚函数,这就是为什么我无法按预期调用 NormalClock::Tick()
AlarmClock::Tick()
函数的主体。
我对 c++ 比较陌生,所以我已经习惯了这个环境中函数和变量的范围。我无法解决的一个问题是能够调用在 class 的 subclass 中定义的函数,该函数将此函数声明为纯虚拟函数。这是我的 class 结构:
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
class 中的 Tick()
函数定义一个主体。但是在这个函数中,我想从它的 superclass、NormalClock
class 调用 Tick()
函数。我的问题是,当我在没有定义任何对象的情况下这样做时,我无法调用 superclass Tick()
函数,因为我的 IDE (VS2013) 认为我指的是从当前 class 到 Tick()
(AlarmClock
subclass)。我在网上四处查看,确定它可能需要使用 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()
离开 :)
你很接近,但你的代码有一些问题。
- AlarmClock 不继承自 NormalClock
- 在 AlarmClock::Tick 中调用 NormalClock::Tick() 而不是 NormalClock::Clock::Tick()
- 在 NormalClock 中,将 Clock::Tick 更改为 class 声明中的 Tick。
谢谢大家,看起来这是一个简单的例子,将 class 声明更改为 class AlarmClock
定义中的 NormalClock
。 VS2013 跳过 NormalClock
class 并仅观察 Clock
中的 Tick()
纯虚函数,这就是为什么我无法按预期调用 NormalClock::Tick()
AlarmClock::Tick()
函数的主体。