一般而言,覆盖一个虚拟方法,能够使用覆盖方法如下:
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之一。
如果你想要的是能够通过一个被称为“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;
}
总是会调用基类的方法不虚。