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

标签 c++

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

#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/

相关文章:

c++ - 使用 boost::bind 和 boost::static_pointer_cast 转换 boost::shared_ptr 的 vector

c++ - 为什么我不能有一个与成员类型同名的方法?

c++ - 将 export 关键字与模板一起使用

c++ - 带字符的矩阵

c++ - 使用 stringstream 精度格式化 float 但丢弃零填充

C++从未定义的函数访问类

通过循环的C++ vector 输入

c++ - 如何从用花括号初始化的对象中捕获异常抛出?

c++ - 包含抽象基类的 ptr_map 的映射对象

c# - 包装 C++ 以便在 C# 中使用