调用覆盖的方法如果基本方法没有虚拟

问题描述 投票:2回答:1

一般而言,覆盖一个虚拟方法,能够使用覆盖方法如下:

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()都不在基类的虚?

附加信息:

我想可能违反了多态的概念。尽管如此,我很好奇,看看是否有一个解决方案,甚至是黑客-Y之一。

c++ c++11
1个回答
1
投票

如果你想要的是能够通过一个被称为“DoSomething的”(或任何你的实际应用中)函数调用那些你标志着在基类的虚方法,在你表现出的方​​式。然后,你还可以通过从基类,像这样复制其定义越权“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;
}

不过,我敢肯定你认识到,在派生类中重复这样的方法气味。所以,最好不要这么做。

如果你本来打算在代码中后期绑定别的地方使用,那么你会遇到问题,如果您避免使用虚拟。例如,改变“主”于以下内容:

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

总是会调用基类的方法不虚。

© www.soinside.com 2019 - 2024. All rights reserved.