gpt4 book ai didi

c++ - 那么我们可以将虚函数与分配在堆栈上的对象一起使用吗?

转载 作者:太空狗 更新时间:2023-10-29 23:30:11 25 4
gpt4 key购买 nike

我想了很长时间,要使用虚函数,类对象必须分配一个指针,但我运行了一个测试示例,它似乎可以完美地用于堆栈上的对象,它只取决于语法如何你叫它。但我所做的感觉几乎就像我在创造一个“作弊”来让系统做我想做的事,即使用普通基类指针调用派生类虚方法。

#include <iostream>

using namespace std;

class B{
public:
virtual void call() { cout<<"B\n"; };
};

class D: public B{
public:
void call() { cout<<"D\n"; }
};

int _tmain(int argc, _TCHAR* argv[])
{
B b;
D d;

b.call(); // output is "B"

d.call(); // output is "D"

B* obj = &d;
obj->call(); // output is "D"

return 0;
}

在发布软件中这样做是否可以接受,还是会引起注意?我可以在我的软件中充分利用这一点,但我以前从未见过这样的事情。

在我的实际项目中,我有在堆栈上分配的基类和派生类,我们称它们为BaseDerivedADerivedB。我想重组虚函数并将其添加到基础中,我想我现在必须在堆上分配它们,但看起来我不必这样做。现在我的应用程序可能处于某种状态,所有操作都将在 DerivedADerivedB 上完成,所以我计划添加一个指针对象:

Base * obj = &DerivedA;

显然,当我需要将操作切换到其他对象时,我只需执行 obj = &DerivedB 基本上我将通过我的新 obj 指针间接使用这两个对象进行所有操作.这看起来合理吗?

目前我的代码有 if else 语句来对 DerivedADerivedB 进行操作,这将消除这些。

最佳答案

这很正常。 C++ 的黄金法则之一是对象不应该关心谁拥有它们——包括堆栈。在同一堆栈框架中保存指向派生对象的基指针并不常见,因为这会引发关于为什么不直接使用它的问题,但以多态方式引用自动存储持续时间对象是完全合法且常见的.

注意我说的是“自动存储持续时间”而不是“在堆栈上”。这是因为相同的规则适用于任何自动存储持续时间对象 - 类成员是最明显的例子。

关于c++ - 那么我们可以将虚函数与分配在堆栈上的对象一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28885225/

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