通常,覆盖虚拟方法可以使用如下所示的覆盖方法:
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解决方案。
答案 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 的情况下调用基类的方法。