- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
以下段落摘自 Stroustup 书《The C++ Programming Language》(第三版)第 420 页:
Because a pointer to a virtual member (s in this example) is a kind of offset, it does not depend on an object’s location in memory. A pointer to a virtual member can therefore safely be passed between different address spaces as long as the same object layout is used in both. Like pointers to ordinary functions, pointers to nonvirtual member functions cannot be exchanged between address spaces.
我对本段的最后一句话提出异议。下面,您将找到一个代码片段,其中指向非虚拟成员函数的指针,foo()
和 foo1()
,在一个基数之间交换对象 a
和派生对象 b
,没有问题。
不能做的是在派生类中重载基类中的任何函数,foo()
或 foo1()
,因为在这个在这种情况下,编译器将发出如下所示的错误。
#include <iostream>
class A
{
int i;
public:
A() : i(1) {}
void foo() { std::cout << i << '\n'; }
void foo1() { std::cout << 2 * i << '\n'; }
};
class B: public A
{
int j;
public:
B() : A(), j(2) {}
// void foo() { std::cout << j << '\n'; }
};
int main()
{
typedef void (A::* PMF)();
PMF p = &B::foo; // error C2374: 'p' redefinition, multiple initialization
// if foo() is overloaded in B.
PMF q = &B::foo1;
B b;
(b.*p)();
(b.*q)();
A a;
(a.*p)();
(a.*q)();
}
最佳答案
这句话是正确的:在(标准)C++ 中,一个程序,或者说进程,只有一个地址空间。因此,正如 ulidtko 所指出的,这句话指的是在不同进程的地址空间之间交换指向虚拟成员函数与非虚拟成员函数的指针的可能性。
一个类的非虚拟成员函数 几乎是一个标准函数,带有一个指向您调用它的对象的隐式参数(this 指针)。因此,它会在加载时在您的进程地址空间中分配一些地址。它在您的地址空间中的确切位置当然取决于您的平台以及该成员函数是否是动态链接库的一部分。关键是,对于两个进程,它不一定是相同的地址。因此,将指针传递给另一个进程然后在另一个进程中执行这样的函数可能会“让你的机器着火 (TM)”。
虚拟成员函数仍然与非虚拟成员函数非常相似,因为“执行时跳转到内存中的某个地址并将其传递给您的 this 指针”,但它是通过虚函数表 (vtable) 而不是直接调用的。因此,指向虚成员函数的指针几乎只是对象虚函数表的索引。调用该函数然后沿着“获取对象指针,可能增加指针以获取对象的 vtable 并跳转到该表的给定索引处的地址,将对象本身的地址作为 这个指针'。因此,这种通过 vtable 的间接寻址使得在地址空间之间交换指向虚拟成员函数的指针起作用。
免责声明:我有点倾向于“我真的知道我在说什么”——这里的舒适区。因此,如果我过度简化了某些事情或更糟的是,从事散布虚假信息,请随意撕碎我的答案;)。
关于c++ - 我认为下面的陈述不正确或者我遗漏了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15122953/
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
显然,我实际上是想创建一个数组,在多次试验 (5000) 中随机分配生日。然后假设每次有 2 - 50 人至少有 2 个生日时,将结果除以 5,000 以获得近似概率。我相信我的循环搞砸了,希望得到一
PYTHON:试图计算摆在不同行星上摆动所需的时间,我对此非常陌生,因此可能有一个简单的解决方案: def main(): print('Period of a pendulum')
在我的 MySQL 表中,有一行标记为“state”。有 3 个可能的值。我如何利用 PHP 将“Unbanned”回显为状态中的“0”?将“禁止”与“1”相对应,将“临时禁止”与“3”相对应? 我如
我的宏代码中有一个 If 公式,但它似乎没有以正确的方式工作。 下面的代码计算 rCell.Offset 并始终将其应用为 True,我有一些示例,其中它等于 112、113、118 等,并且它正在将
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: Why do you have to put a 1; at the end of a Perl 5 module?
网上查了一下parent::init();的意思.我所能找到的只是 init() 是初始化一些设置,这些设置希望在每次应用程序运行时出现。谁能准确解释 parent::init() 的含义,比如这两个
这个问题已经有答案了: What does "%.*s" mean in printf? (4 个回答) 已关闭 3 年前。 我试图理解 printf() 但我只熟悉 C++ cout= 0; r--
我正在开发一个试图通过 tsv infile 将数据插入 mysql 数据库的 java 项目。运行该程序时出现以下错误: Exception in thread "main" java.sql.SQ
好的,我正在开发一个新的应用程序,只要我使用相对 View ,一切都运行良好。但是,我想要一个选项卡式布局,所以我将我拥有的内容(到目前为止还不多,因为我刚刚从数据库中读取它并且设置正常)切换到选项卡
我在另一个问题中看到了这个提示,想知道是否有人可以向我解释这究竟是如何工作的? try { return x; } finally { x = null; } 我的意思是,finally 子句是否真的
这个问题已经有答案了: Is it better to wrap code into an 'IF' statement, or is it better to 'short circuit' the
我是一名优秀的程序员,十分优秀!