gpt4 book ai didi

c++ - 当我的基类和派生类具有相同的功能时,它必须是虚拟的吗?

转载 作者:行者123 更新时间:2023-11-30 02:51:48 27 4
gpt4 key购买 nike

所以我有一个我正在处理的项目,它具有相当的层次结构。在 this 的基类中,有一个函数 reset() 会在所有派生类中调用。我唯一感到困惑的是,由于派生类中的重置基本上只是重置它的私有(private)变量,然后调用它的前一个(更高)类的 reset() 函数,重置函数是否必须是虚拟的?

例如。

class Base
{
private:
int some;
public:
void reset();
};

class Derive : public Base
{
private:
int some1;
public:
void reset();
};

class Derive_two : public Derive
{
private:
int some2;
public:
void reset();
};

基本上 Derive_two 类的重置函数将如下所示。

void Derive_two::reset()
{
some2 = 10;
Derive::reset();
}

这段代码对吗?还是函数 reset() 需要是虚拟类型?

感谢任何帮助,谢谢。

最佳答案

Is this code right?

可能不会。它不是多态的;这意味着通过指针或对 Base 的引用调用函数将只会调用在 Base 中声明的版本。所以如下:

void DoStuffAndReset(Base & b) {
DoStuff(b);
b.reset();
}

Derive d;
DoStuffAndReset(d);

不会完全重置 d,只会重置它的基类部分,这几乎肯定不是您想要的行为。

Or does function reset() need to be of type virtual?

如果你想覆盖它,并且可以通过指针或对基类的引用调用被覆盖的版本,就需要这样做;这可能是你想要的行为。通过使 reset 虚拟化,我的示例将完全重置对象,无论它是什么类型。

同样,您可能需要一个虚拟析构函数,以便可以通过指向基类的指针正确删除对象。实际上,以下看似无害的代码实际上具有未定义的行为:

Base * b = new Derive;
delete b;

可以通过向 Basepublic 部分添加析构函数来修复:

virtual ~Base() {}  // assuming it doesn't need to do anything

关于c++ - 当我的基类和派生类具有相同的功能时,它必须是虚拟的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19466662/

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