您是否必须传递删除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*>应该可以工作,所以编译器正在存储足够的信息来解决它.
mov eax, DWORD PTR _this$[ebp]
Run Code Online (Sandbox Code Playgroud)
跟踪汇编程序显示这是传递给delete函数的指针.谜团已揭开.
我已经修复了将虚拟析构函数添加到IFoo的示例,这是一个简单的疏忽.再次感谢所有指出的人.
如上面的标题所示,我的问题是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)