关于C++的多继承和多态问题

[复制链接]
查看11 | 回复8 | 2021-1-29 01:24:10 | 显示全部楼层 |阅读模式
两年不写C++,很多东西都不会了,而且当年学的课程也没怎么讲多继承的问题。
假设有类A同时公有继承类B和类C,而B和C同时有虚函数,因此A应该同时有B和C的虚函数表。现在问题是,当A被一个C类型的指针引用并调用虚函数时,如何决定A类对象的虚函数表位置?因为编译的时候没有关于A和B的信息,所以是不是有可能使B的虚函数表和C的发生混淆?C++如何解决这个问题?

回复

使用道具 举报

千问 | 2021-1-29 01:24:10 | 显示全部楼层
说的是这个吗:http://en.wikipedia.org/wiki/Thunk_%28programming%29uraj (Tempusfugit) 在 ta 的帖子中提到:两年不写C++,很多东西都不会了,而且当年学的课程也没怎么讲多继承的问题。假设有类A同时公有继承类B和类C,而B和C同时有虚函数,因此A应该同时有B和C的虚函数表。现在问题是,当A被一个C类型的指针引用并调用虚函数时,如何决定A类对象的虚函数表位置?因为编译的时候没有关于A和B的信息,所以是不是有可能使B的虚函数表和C的发生混淆?C++如何解决这个问题?

回复

使用道具 举报

千问 | 2021-1-29 01:24:10 | 显示全部楼层
所以Java不让多继承了……uraj (Tempusfugit) 在 ta 的帖子中提到:两年不写C++,很多东西都不会了,而且当年学的课程也没怎么讲多继承的问题。假设有类A同时公有继承类B和类C,而B和C同时有虚函数,因此A应该同时有B和C的虚函数表。现在问题是,当A被一个C类型的指针引用并调用虚函数时,如何决定A类对象的虚函数表位置?因为编译的时候没有关于A和B的信息,所以是不是有可能使B的虚函数表和C的发生混淆?C++如何解决这个问题?

回复

使用道具 举报

千问 | 2021-1-29 01:24:10 | 显示全部楼层
我理解错你意思了……是在方法调用的时候会用static_cast将变量指针进行偏移,将A的一个对象分别作为B/C类的对象进行方法调用之前会偏移指针使得vtable在对象指针的固定偏移量上uraj (Tempusfugit) 在 ta 的帖子中提到:两年不写C++,很多东西都不会了,而且当年学的课程也没怎么讲多继承的问题。假设有类A同时公有继承类B和类C,而B和C同时有虚函数,因此A应该同时有B和C的虚函数表。现在问题是,当A被一个C类型的指针引用并调用虚函数时,如何决定A类对象的虚函数表位置?因为编译的时候没有关于A和B的信息,所以是不是有可能使B的虚函数表和C的发生混淆?C++如何解决这个问题?

回复

使用道具 举报

千问 | 2021-1-29 01:24:10 | 显示全部楼层
那如果A是动态加载的会不会出问题?static_cast应该是将A对象地址赋给C类型指针时编译器自动调用的。如果A是动态加载的那么代码里就不会出现C*c_ptr=obj//objisaninstanceofclassA这样的语句了。这时候还有static_cast的效果么?
ryanli (再见了刚背兽!) 在 ta 的帖子中提到:我理解错你意思了……是在方法调用的时候会用static_cast将变量指针进行偏移,将A的一个对象分别作为B/C类的对象进行方法调用之前会偏移指针使得vtable在对象指针的固定偏移量上

回复

使用道具 举报

千问 | 2021-1-29 01:24:10 | 显示全部楼层
怎么动态加载?C++强类型的啊.uraj (Tempusfugit) 在 ta 的帖子中提到:那如果A是动态加载的会不会出问题?static_cast应该是将A对象地址赋给C类型指针时编译器自动调用的。如果A是动态加载的那么代码里就不会出现C*c_ptr=obj//objisaninstanceofclassA这样的语句了。这时候还有static_cast的效果么?

回复

使用道具 举报

千问 | 2021-1-29 01:24:10 | 显示全部楼层
dlopen啊,A的对象作为某.so动态库中的全局变量。
ryanli (再见了刚背兽!) 在 ta 的帖子中提到:怎么动态加载?C++强类型的啊.

回复

使用道具 举报

千问 | 2021-1-29 01:24:10 | 显示全部楼层
多继承和模板是c++两个潘多拉的盒子uraj (Tempusfugit) 在 ta 的帖子中提到:两年不写C++,很多东西都不会了,而且当年学的课程也没怎么讲多继承的问题。假设有类A同时公有继承类B和类C,而B和C同时有虚函数,因此A应该同时有B和C的虚函数表。现在问题是,当A被一个C类型的指针引用并调用虚函数时,如何决定A类对象的虚函数表位置?因为编译的时候没有关于A和B的信息,所以是不是有可能使B的虚函数表和C的发生混淆?C++如何解决这个问题?

回复

使用道具 举报

千问 | 2021-1-29 01:24:10 | 显示全部楼层
那不是只能reinterpret_cast了?不懂啊……uraj (Tempusfugit) 在 ta 的帖子中提到:dlopen啊,A的对象作为某.so动态库中的全局变量。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行