C+中的动态绑定+@ 我是C++的新手,请帮助我,编译器是如何做动态绑定的,即使Cyr1、Case2和Cuff3不使用继承类,如基类和派生类关系->类派生::公共类基类{};
C+中的动态绑定+@ 我是C++的新手,请帮助我,编译器是如何做动态绑定的,即使Cyr1、Case2和Cuff3不使用继承类,如基类和派生类关系->类派生::公共类基类{};,c++,C++,#include <iostream> using namespace std; class Class1{ public: virtual void f(){ cout << "f() in class 1\n"; } void g(){ cout << "g() in class 1\n"; } }; class Class2{ public: virtua
#include <iostream>
using namespace std;
class Class1{
public:
virtual void f(){
cout << "f() in class 1\n";
}
void g(){
cout << "g() in class 1\n";
}
};
class Class2{
public:
virtual void f(){
cout << "f() in class 2\n";
}
void g(){
cout << "g() in class 2\n";
}
};
class Class3{
public:
virtual void f(){
cout << "f() in class 3\n";
}
};
int main()
{
Class1 object1, *p;
Class2 object2;
Class3 object3;
p = &object1;
p->f();
p->g();
p = (Class1 *)&object2;
p->f();
p->g();
p = (Class1 *) &object3;
p->g();
return 0;
}
Output:
f() in class 1
g() in class 1
f() in class 2
g() in class 1
g() in class 1
#包括
使用名称空间std;
一班{
公众:
虚空f(){
cout g();
返回0;
}
输出:
类1中的f()
类1中的g()
类2中的f()
类1中的g()
类1中的g()
未定义的行为。
在完全不相关的类型之间转换并访问它们的内容是未定义的行为,所以任何事情都可能发生,包括看起来像是工作了一样
不要这样做
此外,在该上下文中使用C样式转换类似于重新解释转换。您应该尽可能避免使用该转换。例如,如果使用
静态转换
,则会出现编译器错误。以下是对此处发生情况的解释:
1.)如果类中至少存在一个虚拟函数,则构造函数将为该类创建一个vtable,并为调用对象创建一个vptr。此vtable仅包含虚拟函数。然后,编译器将在运行时(动态绑定)解析每个多态调用从指针所指的对象类型,而不是指针本身的类型。
因此,这里:
2.)类1将有一个vtable,我们称之为vtable(类1)。然后是vtable(类2)和vtable(类3)。将有4个vptr、vptr(对象1)、vptr(p)、vptr(对象2)和vptr(对象3)。
3.)因此,当在运行时解析调用;p=(类1*)&object 2;p->f();和p->g()时,编译器将查找由p引用的对象的对象vptr,即对象2;虽然它被强制转换,但引用的对象仍然是对象2,因此将调用vptr(对象2),它将在vtable(类2)中搜索虚拟函数f在搜索g()时,vptr不会在vtable中找到它,因此会查找指针本身的类型,即类1,并调用类1的g。
4.)注意:虚拟函数与多态性有关,而不是继承。明白你的意思,通过使用reinterpret_cast,我们强制编译器强制转换不相关的类型,如果我们尝试使用static_cast,它将导致编译时错误,因为类型不相关。谢谢:)