相关疑难解决方法(0)

delete是否适用于指向基类的指针?

您是否必须传递删除new返回的相同指针,或者您可以将指针传递给其中一个类基类型?例如:

class Base
{
public:
    virtual ~Base();
    ...
};

class IFoo
{
public:
    virtual ~IFoo() {}
    virtual void DoSomething() = 0;
};

class Bar : public Base, public IFoo
{
public:
    virtual ~Bar();
    void DoSomething();
    ...
};

Bar * pBar = new Bar;
IFoo * pFoo = pBar;
delete pFoo;
Run Code Online (Sandbox Code Playgroud)

当然,这大大简化了.我真正想要做的是创建一个充满boost :: shared_ptr的容器,并将其传递给一些代码,这些代码在完成后将从容器中删除它.这段代码对Bar或Base的实现一无所知,并且依赖于shared_ptr析构函数中隐含的delete运算符来做正确的事情.

这可能有用吗?我的直觉说不,因为指针不会有相同的地址.另一方面,dynamic_cast <Bar*>应该可以工作,所以编译器正在存储足够的信息来解决它.


感谢您的帮助,所有回答和评论的人.我已经知道虚拟析构函数的重要性,如我的例子所示; 在看到答案后我稍微考虑了一下,并意识到虚拟析构函数的全部原因就是这个确切的场景.因此它必须工作.由于没有将指针转换回原件的可见方法,我被抛出了.多一点思考让我相信有一种看不见的方法,我理论上析构函数正在返回真正的删除指针以释放.当我在~Base中看到这一行时,调查来自Microsoft VC++的编译代码证实了我的怀疑:

mov eax, DWORD PTR _this$[ebp]
Run Code Online (Sandbox Code Playgroud)

跟踪汇编程序显示这是传递给delete函数的指针.谜团已揭开.

我已经修复了将虚拟析构函数添加到IFoo的示例,这是一个简单的疏忽.再次感谢所有指出的人.

c++ polymorphism boost

44
推荐指数
1
解决办法
2万
查看次数

C++是否会生成一个新对象?

如上面的标题所示,我的问题是C++强制转换是否确实创建了目标类的新对象.当然,在问这个问题之前,我使用过谷歌,MSDN,IBM和stackoverflow的搜索工具,但是我找不到合适的答案.

让我们考虑使用虚拟继承解决钻石问题的以下实现:

#include <iostream>
#include <cstdlib>

struct A
{
  int a;

  A(): a(2) {  }
};

struct B: virtual public A
{
  int b;

  B(): b(7) {  }
};

struct C: virtual public A
{
  int c;

  C(): c(1) {  }
};

struct END: virtual public B, virtual public C
{
  int end;

  END(): end(8) {  }
};

int main()
{
  END *end = new END();
  A *a = dynamic_cast<A*>(end);
  B *b = dynamic_cast<B*>(end);
  C *c = dynamic_cast<C*>(end);

  std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ casting

6
推荐指数
2
解决办法
4294
查看次数

标签 统计

c++ ×2

boost ×1

casting ×1

polymorphism ×1