【问题标题】:C++ - Parameters of a pure virtual functionC++ - 纯虚函数的参数
【发布时间】: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


【解决方案1】:

DerivedA1::func(string) 正在隐藏 Base::func()。这是允许的,但不会覆盖Base::func 的行为。 clang 会警告你,因为它几乎总是一个错误

class DerivedA1 : public Base {
 public:
  virtual bool func(string command);
};

这很好:

class DerivedB1 : public Base {
 public:
  virtual void func();
}

这是覆盖DerivedA1::func(string)。仅存在于DervivedA1 接口或从它派生的东西上的虚函数。它不存在于Base

class DerivedA2 : public DerivedA1 {
 public:
  bool func(string command);     //This one implements it differently
};                  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    相关资源
    最近更新 更多