首先,我想清楚地表明我确实理解在C++标准中没有vtable和vptrs的概念.但是我认为几乎所有实现都以几乎相同的方式实现虚拟调度机制(如果我错了,请纠正我,但这不是主要问题).另外,我相信我知道虚函数是如何工作的,也就是说,我总能告诉我将调用哪个函数,我只需要实现细节.
假设有人问我以下内容:
"您的基类B具有虚函数v1,v2,v3和派生类D:B,它会覆盖函数v1和v3并添加虚函数v4.解释虚拟调度的工作原理".
我会这样回答:
对于每个具有虚函数的类(在本例中为B和D),我们有一个单独的指向函数的数组,称为vtable.
B的vtable将包含
&B::v1
&B::v2
&B::v3
Run Code Online (Sandbox Code Playgroud)
D的vtable将包含
&D::v1
&B::v2
&D::v3
&D::v4
Run Code Online (Sandbox Code Playgroud)
现在B类包含一个成员指针vptr.D自然地继承它,因此也包含它.在BB的构造函数和析构函数中设置vptr指向B的vtable.在DD的构造函数和析构函数中,它指向D的vtable.
对多态类X的对象x上的虚函数f的任何调用都被解释为对x.vptr的调用[f在vtables中的位置]
问题是:
1.我在上述描述中有任何错误吗?
2.编译器如何知道f在vtable中的位置(请详细说明)
3.这是否意味着如果一个类有两个基数那么它有两个vpt?在这种情况下发生了什么?(尝试以与我相似的方式描述,尽可能详细地描述)
4.钻石层次结构中发生了什么,其中A位于顶部B,C位于中间,D位于底部?(A是B和C的虚拟基类)
提前致谢.
我尝试使用以下命令连接到数据库服务器:
psql -h host_ip -d db_name -U user_name --password
Run Code Online (Sandbox Code Playgroud)
它显示以下行并拒绝连接.
psql: FATAL: too many connections for role "user_name".
Run Code Online (Sandbox Code Playgroud)
如何关闭活动连接?
我没有数据库的管理员权限.我只是一个普通用户.
用于说明虚拟分派在运行时发生的原因的最常见示例是在编译时无法确定将要创建哪个Derived类.例如:
Base* b = (rand() % 2 == 1 ? new Derived1() : new Derived2());
Run Code Online (Sandbox Code Playgroud)
或者当它取决于用户输入.
假设情况都不是这样,并且可以在编译时完全确定基指针引用的Derived类.
如果在编译时知道基类指针指向哪个Derived类,编译器是否通过用适当的Derived函数替换它来优化虚函数调用,而不是在运行时进行vtable查找?
我有一个包含大量条目的csv文件.我必须从文件中读取某些行.行号存储在名为lineno的变量中.
怎么做到这一点?它可能看起来像:
line=$(sed -n "($lineno)p")
Run Code Online (Sandbox Code Playgroud)
我想知道正确的语法来做到这一点.
谢谢
在机械化中,我们使用follow_link或click_link单击链接.在美丽的汤中是否有类似的东西点击网页上的链接?
我有一个文件,其中包含编号为0到149的条目.我正在编写一个bash脚本,从这150个条目中随机选择15个并从中创建另一个文件.
我尝试使用随机数生成器:
var=$RANDOM
var=$[ $var % 150 ]
Run Code Online (Sandbox Code Playgroud)
使用var我选择了那15个条目.但我希望所有这些条目都不同.有时相同的条目被拾取两次.有没有办法在一定范围内创建一系列随机数(在我的例子中,0-149)?
假设变基涉及两个分支A和B。我是唯一对这些分支进行更改的人,但还有其他人拉动这些分支只是为了查看正在发生的事情(审查)。他们根本没有/不会对这些分支进行任何更改。考虑到变基与合并的优缺点,变基显然是更好的选择
现在,关于 rebase 的 git 文档提到了关于 rebase 的黄金法则
git rebase 的黄金法则是永远不要在公共分支上使用它。
并解释为什么它可能很危险。
我了解变基和合并之间的区别,以及当其他开发人员提交到父分支时,事情会如何出错。
即使我是这两个涉及变基的分支的唯一开发人员,我是否应该避免这种情况?当我在变基后强制推送并且其他团队成员尝试拉出这些分支(同样只是为了查看它们,他们没有做出任何更改)之后,可能会出现什么问题?
来自维基百科:
页表查找可能由于两个原因而失败。第一个是如果没有可用于虚拟地址的转换,则意味着虚拟地址无效。
此外,如果每个进程都有自己的页表,这意味着页表中的条目都会有一些从虚拟地址到物理地址的转换。那么页表条目无效是什么意思呢?如果条目存在,则意味着转换存在,因为条目只不过是从虚拟地址到物理地址的映射。
假设我有以下类:
class Base {
virtual void func() { cout << "func base" << endl; }
};
class A : virtual public Base {
public:
virtual void func() { cout << "func A" << endl; }
};
class B : virtual public Base {
public:
virtual void func() { cout << "func B" << endl; }
};
class C : public A, public B {
C(bool is_a);
public:
virtual void func() { // Call appropriate parent's func here }
};
Run Code Online (Sandbox Code Playgroud)
我的要求是 …
c++ ×3
bash ×2
shell ×2
bitbucket ×1
connection ×1
git ×1
github ×1
inheritance ×1
postgresql ×1
psql ×1
python ×1
rebase ×1
sed ×1
sql ×1
tlb ×1
vptr ×1
vtable ×1
web-scraping ×1