如果基本方法不是虚拟的,则调用覆盖的方法

时间:2019-01-17 23:42:05

标签: c++ c++11

通常,覆盖虚拟方法可以使用如下所示的覆盖方法:

class base
{
  public:
  virtual void start() {std::cout << "base start" << std::endl;}
  virtual void stop() {std::cout << "base stop" << std::endl;}
  void doSomething() { start(); stop(); }
};

class derived : public base
{
  public:
   void start() {std::cout << "derived start" << std::endl;}
   void stop() {std::cout << "derived stop" << std::endl;}
};

int main () {
    derived d;
    d.doSomething();
    return 0;
}

此代码段的输出为:

derived start
derived stop

我的问题是,如果函数start()stop()在基类中不是虚拟的,如何实现相同的行为?

其他信息:

我想要的可能违反了多态概念。尽管如此,我很好奇是否有解决方案,甚至是hack-y解决方案。

1 个答案:

答案 0 :(得分:1)

如果您想要的是能够通过一个名为“ doSomething”的函数(或任何实际的应用程序)调用在基类中标记为 virtual 的那些方法,你证明了。然后,您还可以通过从基类复制其定义来覆盖派生类中的“ doSomething”,如下所示:

#include <iostream>

class base
{
public:
  void start() {std::cout << "base start" << std::endl;}
  void stop() {std::cout << "base stop" << std::endl;}
  void doSomething() { start(); stop(); }
};

class derived : public base
{
public:
  void start() {std::cout << "derived start" << std::endl;}
  void stop() {std::cout << "derived stop" << std::endl;}
  void doSomething() { start(); stop(); }
};

int main () {
    derived d;
    d.doSomething();
    return 0;
}

但是,我确定您知道在派生类中复制这样的方法会产生气味。因此最好不要这样做。

如果您打算在代码的其他位置使用 late绑定,那么如果避免使用 virtual ,则会遇到麻烦。例如,将“ main”更改为以下内容:

int main () {
    base* d = true ? new derived : new base;
    d->doSomething();
    return 0;
}

将始终在没有 virtual 的情况下调用基类的方法。