我想了很长时间,要使用虚函数,类对象必须分配一个指针,但我运行了一个测试示例,它似乎可以完美地用于堆栈上的对象,它只取决于语法如何你叫它。但我所做的感觉几乎就像我在创造一个“作弊”来让系统做我想做的事,即使用普通基类指针调用派生类虚方法。
#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;
}
在发布软件中这样做是否可以接受,还是会引起注意?我可以在我的软件中充分利用这一点,但我以前从未见过这样的事情。
在我的实际项目中,我有在堆栈上分配的基类和派生类,我们称它们为Base
、DerivedA
和DerivedB
。我想重组虚函数并将其添加到基础中,我想我现在必须在堆上分配它们,但看起来我不必这样做。现在我的应用程序可能处于某种状态,所有操作都将在 DerivedA
或 DerivedB
上完成,所以我计划添加一个指针对象:
Base * obj = &DerivedA;
显然,当我需要将操作切换到其他对象时,我只需执行 obj = &DerivedB
基本上我将通过我的新 obj
指针间接使用这两个对象进行所有操作.这看起来合理吗?
目前我的代码有 if else
语句来对 DerivedA
或 DerivedB
进行操作,这将消除这些。
最佳答案
这很正常。 C++ 的黄金法则之一是对象不应该关心谁拥有它们——包括堆栈。在同一堆栈框架中保存指向派生对象的基指针并不常见,因为这会引发关于为什么不直接使用它的问题,但以多态方式引用自动存储持续时间对象是完全合法且常见的.
注意我说的是“自动存储持续时间”而不是“在堆栈上”。这是因为相同的规则适用于任何自动存储持续时间对象 - 类成员是最明显的例子。
关于c++ - 那么我们可以将虚函数与分配在堆栈上的对象一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28885225/