【发布时间】:2016-07-22 11:51:36
【问题描述】:
如果我有课说
class Base {
public:
virtual void func() = 0;
};
这是其他两个类的基础
class DerivedA1 : public Base {
public:
virtual bool func(string command);
};
class DerivedB1 : public Base {
public:
virtual void func();
}
class DerivedA2 : public DerivedA1 {
public:
bool func(string command); //This one implements it differently
}; //its base class.
以上是否允许?我声明了没有参数的 func() ,但随后我将它与参数一起使用。我的代码中有类似的情况无法发布,因为这是学校作业的一部分,并且收到类似于
的错误error: no matching function for call to Base::fucn(std::string&)
note: candidate is: virtual bool Base::move();
note: candidate expects 0 arguments, provided 1
我希望 func() 在其不同的派生类中以不同的方式使用。我该如何解决这个问题?
【问题讨论】:
-
不,不允许。基类的
virtual函数的覆盖必须具有完全相同的签名。 -
有一个叫做逆变的概念,它允许派生类改变方法的参数(虽然不是任意的),但这并不适用于这里。您可以使用默认参数:en.cppreference.com/w/cpp/language/default_arguments
-
您可以为参数创建另一个类。虚拟 void func(MyBaseParemeterClass*) = 0;
-
@mike:如果虚函数上的默认参数对于所有重写都不相同,则调用它们的行为会根据使用的类型而有所不同。我觉得这太脆弱和混乱,所以我尽量避免在这种情况下使用默认参数。
标签: c++ inheritance pure-virtual