gpt4 book ai didi

c++ - 虚函数

转载 作者:行者123 更新时间:2023-11-30 04:34:53 26 4
gpt4 key购买 nike

我有一个关于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com