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