- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想我可能把自己弄糊涂了。我知道 C++ 中具有虚函数的类有一个 vtable(每个类类型一个 vtable),所以 Base
类的 vtable 将有一个元素 &Base::print()
,而 Child
类的 vtable 将有一个元素 &Child::print()
。
当我声明我的两个类对象时,base
和 child
,base
的 vtable_ptr 将指向 Base
类的虚表,而 child
的 vtable_ptr 将指向 Child
类的虚表。在我将 base 和 child 的地址分配给一个 Base 类型指针数组之后。我调用了 base_array[0]->print()
和 base_array[1]->print()
。我的问题是,base_array[0]
和 base_array[1]
在运行时都是 Base*
类型,尽管 v-表查找将给出正确的函数指针,Base*
类型如何看到 Child
类中的元素? (基本上值 2?)。当我调用 base_array[1]->print()
时,base_array[1]
是 Base*
类型,但在运行时它发现out 它将使用 Child
类 print()
。但是,我很困惑为什么这段时间可以访问value2
,因为我正在玩type Base*
.....我想我一定错过了什么地方。
#include "iostream"
#include <string>
using namespace std;
class Base {
public:
int value;
string name;
Base(int _value, string _name) : value(_value),name(_name) {
}
virtual void print() {
cout << "name is " << name << " value is " << value << endl;
}
};
class Child : public Base{
public:
int value2;
Child(int _value, string _name, int _value2): Base(_value,_name), value2(_value2) {
}
virtual void print() {
cout << "name is " << name << " value is " << value << " value2 is " << value2 << endl;
}
};
int main()
{
Base base = Base(10,"base");
Child child = Child(11,"child",22);
Base* base_array[2];
base_array[0] = &base;
base_array[1] = &child;
base_array[0]->print();
base_array[1]->print();
return 0;
}
最佳答案
通过指针调用 print
会进行 vtable 查找以确定要调用的实际函数。
该函数知道“this”参数的实际类型。
编译器还会插入代码来调整参数的实际类型(假设你有一个子类:
public base1, public base2 { void print(); };
其中print
是继承自base2
的虚拟成员。在这种情况下,相关的 vtable 将不会在 child 中的偏移量为 0,因此需要进行调整以将存储的指针值转换为正确的对象位置)。
该修复所需的数据通常存储为隐藏运行时类型信息 (RTTI) block 的一部分。
关于C++基类指针调用子虚函数,为什么基类指针能看到子类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50539965/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!