gpt4 book ai didi

c++ - 覆盖 C++ 虚方法

转载 作者:IT老高 更新时间:2023-10-28 23:03:42 26 4
gpt4 key购买 nike

我有一个类模板,其中一些方法被定义为虚拟方法,以便我的类的用户能够在他的派生类中为它们提供实现。请注意,在我的模板类中,有一些使用虚拟方法的非虚拟方法(应该返回值的虚拟类在非虚拟类中被调用)。

你能给我一个正确代码的简单示例,其中父类的虚拟方法应该返回一个值(但它的实现是在子类中提供的)并且父类中的虚拟方法返回的值是在该类的其他方法中使用。因为我在某处看到(例如这里:Safely override C++ virtual functions),这可能会导致一些问题,并且用户定义的方法会注意覆盖父类的虚拟方法。

注意:我使用 g++ 编译器使用 Code::Blocks 进行编程。

编辑:按照这里的要求,我想要一个简单的例子:

template<typename T>
class parent {
public:
// Public methods that user can call
int getSomething(T t);
void putSomething(T t, int x);

// public method that user should implement in his code
virtual float compute(T t) { }

// protected or private methods and attributes used internally by putSomething ...
float doComplexeThings(...); // this can call
};

compute() 方法应该由用户(子类)实现。但是,例如 putSomething() 和 doComplexeThings() 调用了这个方法 compute()。

最佳答案

如果您可以在编译器中使用 C++11 功能,则可以使用 override 特殊标识符对覆盖进行标记:

 float compute() override;

派生类中的上述行将导致编译器错误,因为该函数没有覆盖基类中的成员函数(签名不正确,缺少参数)。但请注意,这必须在每个派生类中完成,这不是您可以从基类强加的解决方案。

从基类中,您只能强制通过使函数成为纯虚拟函数来进行覆盖,但这会改变语义。它不会在覆盖时避免问题,而是在所有情况下强制覆盖。我会避免这种方法,如果您要遵循它并且对基本类型有一个合理的实现,请让函数 virtual 提供一个定义,以便您的派生类的实现可以只调用函数基本类型(即您强制实现,但在最简单的情况下,它只会将调用转发给父级)

关于c++ - 覆盖 C++ 虚方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9018077/

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