- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是一段显然不起作用的代码,因为在构造函数中向下转换“this”是非法的:
#include <cassert>
class A {
protected:
virtual ~A() {}
public:
A();
};
class B : public A {
};
A::A() {
assert(dynamic_cast<B*>(this));
}
int main(void) {
B b;
return 0;
}
正如预期的那样,当使用 g++ 编译时,断言失败。
这是另一个有效的代码(至少在 g++ 4.7 中,我还没有尝试过其他编译器):
#include <cassert>
class A {
protected:
virtual ~A() {}
public:
A() {}
void f();
};
class B : public A {
public:
B() {
f();
}
};
void A::f() {
assert(dynamic_cast<B*>(this));
}
int main(void) {
B b;
return 0;
}
我的问题是:第二个代码是“合法的”吗?也就是说,我可以期望任何编译器都能以这种方式工作吗?
我的直觉是,由于 f() 是从 B 的构造函数的主体中调用的,因此“b”已经作为类型 B 的实例得到了良好的构造,这使得代码合法。然而,我仍然有点 dynamic_casting 来自构造函数的“this”......
(请注意,我的问题不是这是否是好的做法,而是它是否合法)。
最佳答案
是的,第二个例子定义好,强制转换成功。 B
的构造函数中,对象的动态类型为 B
,因此转换为 B*
会成功。
在第一个示例中,如您所说,在 A
的构造函数中,动态类型是 A
,因此转换为 B*
会失败。
关于c++ - dynamic_cast "this"到派生类型 : when is it legal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29946327/
我经常听到有人这样说 All JavaScript code is legal TypeScript code 或 TypeScript is a superset of JavaScript 但是当
如果为对象预留内存(例如,通过 union )但构造函数尚未被调用,调用对象的非静态方法之一是否合法,假设该方法不依赖于值任何成员变量? 我做了一些研究,发现了一些关于“变体成员”的信息,但找不到与此
更新! 请参阅下面我对 C# 规范的一部分的剖析;我想我一定遗漏了什么,因为对我来说,我在这个问题中描述的行为实际上违反了规范。 更新2! 好的,经过进一步思考,并根据一些评论,我想我现在明白发生了什
我有代码: #include template class> struct Foo { enum { n = 77 }; }; template class C> struct Foo {
int ar[] = { 1, 2, 3, }; 这段代码合法吗? (我的意图是) int ar[] = { 1, 2, 3 }; 最佳答案 是的,C89 和 GNU89 中的初始化列表中都允许使用杂
我有一个 map View 被以下代码剪裁成一个圆圈。 roundMapView.layer.cornerRadius = roundMapView.frame.size.width/2
这个问题已经存在: Why sizeof(x++) does not increment the variable x value [duplicate] 关闭 9 年前。 给定以下代码,它在 C
在深入研究 MFC 时,我发现了这段代码: _AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL
我正在使用 MKMapSnapshotter 创建一个小型 MKMapView 的 UIImage 屏幕截图(并存储以备后用)。但我注意到的一件事是它从快照中删除了“合法”标签。 Here答案是删除“
在这个公认的人为设计的示例中,X 类型的右值在语句末尾按预期被销毁。但是,被销毁的对象仍然可以通过非常量引用“x”访问。这是合法的 C++ 吗?如果是这样,结果是未定义的还是未指定的?编译器不应该在这
这是一段显然不起作用的代码,因为在构造函数中向下转换“this”是非法的: #include class A { protected: virtual ~A() {} public:
考虑以下语句: int *pFarr, *pVarr; int farr[3] = {11,22,33}; int varr[3] = {7,8,9}; pFarr = &(farr
似乎只有向上滑动才能移除带动画的导航栏。我想让它褪色,就像在 Photos.app 中一样。 更改 alpha 最简单,但是 Apple's guidelines state : Prior to i
考虑一下这个相当无用的程序: #include int main(int argc, char* argv[]) { int a = 5; auto it = [&](auto self)
我添加了一个 MKMapView作为 XIB 中我的一个 ViewController 的 subview 。该 map 在显示方向方面工作正常。但是 Legal map 上的文字(左下)显示为 而不
这个问题在这里已经有了答案: JavaScript ternary operator example with functions (6 个答案) Ternary operators in Java
我有两个类如下。 class NeuroShield { public: NeuroShield(); uint16_t begin(); void setNcr(uint16
能够将传递给文字运算符的字符串转换为 MPL 序列会很有用,因为这样我们就可以根据字符串的内容控制代码生成。以前,我认为这是不可能的,因为 constexpr 函数的参数在函数体内不被视为常量表达式。
这是一个有点深奥的问题,但我很好奇以下类扩展模式在现代 C++ 中是否合法(例如,不构成 UB)(出于所有意图和目的,我可以将讨论限制在 C+ +17 及更高版本)。 template struct
我正在使用 MagicalRecord, 这就是我设置 coreData 堆栈的方式 - (BOOL)application:(UIApplication *)application didFinis
我是一名优秀的程序员,十分优秀!