c++ - 虚函数

标签 c++ virtual-functions

我有一个关于 C++ 虚函数的问题。

派生类 (DerivedAlgo) 实现了虚函数 (BaseAlgo::process),但通过使用 DerivedData< 对函数签名做了一点改动 输入参数而不是 BaseData。

尽管基类中有纯抽象函数,我仍然能够创建 DerivedAlgo 类的实例,而且编译器一点也不提示。

我只是想知道有人知道任何可以解释以下代码的 C++ 规则。

class BaseData{};
class DerivedData: public BaseData{};
class BaseAlgo{
public:
  virtual void process(BaseData& data) = 0;
};
class DerivedAlgo: BaseAlgo{
public:
  virtual void process(DerivedData& data){
    std::cout << "hello world!" << std::endl;
  }
};

在我的另一个示例代码中,我定义了 process(DerivedData&)process(BaseData&)

编译器仍然可以运行而不会提示任何歧义。

class DerivedAlgo{
public:
  virtual void process(DerivedData& data){...}
  virtual void process(BaseData& data){...}
};
BaseData baseData;
DerivedData derivedData;
derivedAlgo.process(baseData);
derivedAlgo.process(derivedData);

非常感谢您的任何意见。谢谢!

最佳答案

您的第一个示例无法在 g++ 4.2 上编译。作为引用,我这样做了:

#include <iostream>

class BaseData{};
class DerivedData: public BaseData{};
class BaseAlgo{
public:
  virtual void process(BaseData& data) = 0;
};
class DerivedAlgo: BaseAlgo{
public:
  virtual void process(DerivedData& data){
    std::cout << "hello world!" << std::endl;
  }
};

int main()
{
    DerivedAlgo da;

    return 0;
}

得到这个:

error: cannot declare variable 'da' to be of abstract type 'DerivedAlgo'
note:   because the following virtual functions are pure within 'DerivedAlgo'
note:  virtual void BaseAlgo::process(BaseData&)

如果类似我的例子的东西确实编译了,那么你几乎肯定有一个有问题的编译器。

您的第二个示例将通过编译,因为它覆盖了抽象函数。第一次调用将调用基础数据版本,而第二次调用将调用流程的派生版本。

请注意,在您的第一个示例中,您隐藏 process(base) 版本的函数,根本没有覆盖它。重写虚函数时不应更改函数签名。

关于c++ - 虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5706981/

相关文章:

c++ - 虚函数和性能 - C++

c++ - 在使用 Nifty Counter C++ Idiom 时,构造函数必须被调用两次吗?

c++ - 使用范围守卫作为代码契约

c++ - 为什么我必须在覆盖 [C++] 时重新声明一个虚函数

C++ 虚函数调用与 boost::function 调用的速度对比

c++ - 数据类型 inst 转换正确吗?

c++ - 类模板 : why can't I specialize a single method for void type?

c++ - 使用 BFS 了解树遍历的时间复杂度

c++ - 当 weak_ptr 的 shared_ptr 被销毁时会发生什么?

c++ - if/else 与虚函数 : design performance