【发布时间】:2015-07-27 07:51:07
【问题描述】:
到目前为止,我还没有找到确切的答案。什么时候从对象中调用this-> 是安全的。尤其是在构造函数和析构函数内部。
而且,当使用公共继承时。对 this 调用的结果使用向上和向下转换是否安全?
例如:
class foo
{
foo():
a(),
b(this->a)//case 1
{
this-> a = 5; //case 2
}
int a;
int b;
};
class bar: public baz
{
bar():
baz(this)//case 3 - assuming baz has a valid constructor
{
}
}
最后是最不可能的一个
foo()
{
if(static_cast<bar*>(this));//case 4
}
以上哪些情况是合法的?
注意:我知道上面的很多做法都是不可取的。
【问题讨论】:
-
您错误地使用了多态性。基类不应该依赖于孩子的结构。永远不要将 this 或 this 字段传递给基类的构造函数。
-
@avensus 这个字段,你是指类的任何字段,还是通过这个访问字段?
-
我的意思是任何基类都不应该接收,因为它是初始化参数,也不是子字段的值,也不是子类的 this 指针本身。以这种 PHP 风格的方式,您可以在 base 和 child 之间提供强大的依赖关系。一个孩子已经依赖于基地。然后你添加反向依赖!顺便说一句,控制反转声明您的客户端代码仅依赖于基类,然后通过多态性,该基类依赖于真实的子实现。我的建议:只使用虚拟方法。不要重新发明多态性。
-
@avesus 是的,实际上你是对的。我现在想起来这样做也很不合逻辑。由于分配必须从构造函数完成。这意味着您将分配一个成员变量,然后依次使用该变量来初始化父类。我问这个问题的原因是因为我看到在 qt 中使用
this来检查一个类是否是特定其他类的父类。我将更新问题以包括背景:) -
不错!这个指针本身在任何时候都可以安全使用。成员按照声明的顺序进行初始化。但首先是基类。考虑这一点并编写您的安全代码。还要考虑这个指针值会有所不同。指针算术可以占据一席之地。我认为 Qt 使用了一些安全的技巧。如果您编写代码,程序员会回答 ;-)
标签: c++ c++11 constructor destructor