我在實際開發中遇到一個問題,之前沒接觸過,不知道該怎么處理,希望有老哥能不吝賜教

問題情形如下:
就是一個類有多個抽象父類,本地存盤的是其中一個父類的指標,現在我想使用到另一個父類中的方法,應該怎么辦呢?
#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應該怎么做?
}
uj5u.com熱心網友回復:
就是想問:怎么使用A*指標去訪問到類B的方法uj5u.com熱心網友回復:
以下個人理解,錯誤的話歡迎指正:((B*)a)->funcB();
強行轉換型別并沒有改變到指標地址,那指向的地址還是原來的函式指標串列,假如編譯時class A 的funA偏移地址為 *A +0x4保存函式指標
同理class B 的 funB偏移也為 +0x4;
所以你強轉之后 ((B*)a)->funcB();實際呼叫的 地址是 (Int)&C+0x4 和 a->funcA()的地址是一樣的,所以你實際呼叫的還是 a->funcA();并不是 funcB();
uj5u.com熱心網友回復:
補充一下 new C;假如
a 的結構為
a --> class A(類結構)
class B(類結構)
要呼叫B就是 a+class A的占位地址,指向的結構就是B,這個應該可以除錯具體看一下
uj5u.com熱心網友回復:
多謝指點,理解了,所以這樣如果要通過A指標訪問到B的函式,只能通過計算A類的地址偏移去呼叫B類函式嗎?這樣做就有點太麻煩了。。。
我的需求是這樣的:
因為A是一個核心的基類,已經派生了很多子類了,但現在我想增加一個擴展,因此增設了B類(類似于介面),我想讓那些已經實作了的A的派生類,只需繼承B,實作B的純虛函式以達到擴展的目的
但我實作之后卻發現我將A類指標轉換成B類呼叫,出現記憶體泄漏了,除錯定位之后才發現問題確實如你所說,因此我想請問一下你知道應該怎么才能實作呼叫嗎?或者針對的需求,能不能給與一個其他的實作思路,多謝了
uj5u.com熱心網友回復:
感謝上面老哥的指點:使用下面的方法確實可以呼叫成功,但是有些麻煩,不知道有沒有老哥有更好的方法
((B*)((char*)(a)+sizeof (A)))->funcB();
uj5u.com熱心網友回復:
(C*)a->funcB();uj5u.com熱心網友回復:
還可以這樣: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應該怎么做?
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/270289.html
標籤:C++ 語言
上一篇:請問為什么我的qt的qimage無法load圖片,一直return false
下一篇:代碼錯哪了?
