C++多个抽象父类的问题,一个父类指针如何调用另一个父类的函数

Italink 2021-03-31 09:30:37
我在实际开发中遇到一个问题,之前没接触过,不知道该怎么处理,希望有老哥能不吝赐教
问题情形如下:
就是一个类有多个抽象父类,本地存储的是其中一个父类的指针,现在我想使用到另一个父类中的方法,应该怎么办呢?


#include <iostream>
using namespace std;

class A{
public:
virtual void funcA(){
cout<<v;
}
private:
int v=5;
};

class B{
public:
virtual void funcB(){
cout<<v;
}
private:
int v=15;
};
class C:public A, public B{

};

int main()
{
A* a= new C;
a->funcA(); //输出5
((B*)a)->funcB(); //输出5
//请问我要输出15应该怎么做?
}

...全文
278 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
SleekStone 2021-04-01
  • 打赏
  • 举报
回复
强制转换通常不太优雅,我一般这么玩(dynamic_cast性能不好,请结合实际使用):
A* a = new C;
	a->funcA();         //输出5
	((B*)a)->funcB();   //输出5

	C *pC = dynamic_cast<C*>(a);
	if (nullptr != pC)
	{
		pC->funcB();  // 输出15
	}
qzjhjxj 2021-03-31
  • 打赏
  • 举报
回复
还可以这样:
int main()
{
    A* a= new C;
    a->funcA();         //输出5
    ((B*)a)->funcB();   //输出5
    ((C*)a)->funcB();   //15

    B* b= new C;
    b->funcB();         //15
    ((C*)b)->funcA();   //5
    //请问我要输出15应该怎么做?
    
}
gouyanfen 2021-03-31
  • 打赏
  • 举报
回复
(C*)a->funcB();
Italink 2021-03-31
  • 打赏
  • 举报
回复
感谢上面老哥的指点: 使用下面的方法确实可以调用成功,但是有些麻烦,不知道有没有老哥有更好的方法

((B*)((char*)(a)+sizeof (A)))->funcB();
Italink 2021-03-31
  • 打赏
  • 举报
回复
引用 2 楼 gouyanfen 的回复:
以下个人理解,错误的话欢迎指正: ((B*)a)->funcB(); 强行转换类型并没有改变到指针地址,那指向的地址还是原来的函数指针列表,假如编译时class A 的funA偏移地址为 *A +0x4保存函数指针 同理class B 的 funB偏移也为 +0x4; 所以你强转之后 ((B*)a)->funcB();实际调用的 地址是 (Int)&C+0x4 和 a->funcA()的地址是一样的,所以你实际调用的还是 a->funcA();并不是 funcB();
多谢指点,理解了,所以这样如果要通过A指针访问到B的函数,只能通过计算A类的地址偏移去调用B类函数吗?这样做就有点太麻烦了。。。 我的需求是这样的: 因为A是一个核心的基类,已经派生了很多子类了,但现在我想增加一个扩展,因此增设了B类(类似于接口),我想让那些已经实现了的A的派生类,只需继承B,实现B的纯虚函数以达到扩展的目的 但我实现之后却发现我将A类指针转换成B类调用,出现内存泄漏了,调试定位之后才发现问题确实如你所说,因此我想请问一下你知道应该怎么才能实现调用吗?或者针对的需求,能不能给与一个其他的实现思路,多谢了
gouyanfen 2021-03-31
  • 打赏
  • 举报
回复
补充一下 new C; 假如 a 的结构为 a --> class A(类结构) class B(类结构) 要调用B就是 a+class A的占位地址,指向的结构就是B,这个应该可以调试具体看一下
gouyanfen 2021-03-31
  • 打赏
  • 举报
回复
以下个人理解,错误的话欢迎指正: ((B*)a)->funcB(); 强行转换类型并没有改变到指针地址,那指向的地址还是原来的函数指针列表,假如编译时class A 的funA偏移地址为 *A +0x4保存函数指针 同理class B 的 funB偏移也为 +0x4; 所以你强转之后 ((B*)a)->funcB();实际调用的 地址是 (Int)&C+0x4 和 a->funcA()的地址是一样的,所以你实际调用的还是 a->funcA();并不是 funcB();
Italink 2021-03-31
  • 打赏
  • 举报
回复
就是想问:怎么使用A*指针去访问到类B的方法

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧