如何将派生类的指针指针作为基类传递?

时间:2013-08-07 11:11:03

标签: c++ pointers casting polymorphism

这是the question asked earlier的后续行动。


LIB_A

我在外部库中有这个基类,比如 LIB_A

class Instrument
{
    // ...
}

LIB_B

我在另一个外部库中有这个派生类,比如 LIB_B ,当然引用 LIB_A

class Bond : public Instrument
{
    // ...
};

LIB_B 中,我还有一个Trader类,它拥有指向它正在使用的键的指针。

class Trader
{
public:
    // ...
    Bond* _bond;
};

LIB_C

我无法触及 LIB_A LIB_B

在我自己的代码中,第三个​​“库”(我在这里松散地使用这个术语),比方说, LIB_C ,我正在尝试创建一个类指向指向Trader的{​​{1}} 指针

Bond

构建
class TradeHelper
{
public:
    TradeHelper(Bond** bondPtr): _bondPtr(bondPtr) {}
    Bond** _bondPtr;
};

一个旁白(无需阅读)

为什么这么复杂的计划?好吧,Trader* t; // assume this is given and not null TradeHelper* th = new TradeHelper(&(t->_bond)) 可能会发生变化,Trader::_bond需要随时了解TradeHelper的{​​{1}}是什么。基本上,Trader链接_bond相关联。这就是为什么,如果我有自由做事我的的方式,我就会完全按照所描述的那样做 - 将这两者联系起来:

TradeHelper

构建
Trader

并通过class TradeHelper { public: TradeHelper(Trader* t): _trader(t) {} Trader* _trader; }; 简单地引用Trader* t; // assume this is given and not null TradeHelper* th = new TradeHelper(t);

唉,由于历史原因和事物的原因,我唯一可以构建Bond的是指向_trader->_bond的指针,而不是{{1}本身。因此我使用了双指针。


问题

好吧,如上所述,一切都会正常工作。但真正的问题是 LIB_C 无法引用 LIB_B ,只能 LIB_A 。这意味着TradeHelper无法了解Trader::_bond,只知道Trader。我的例子改写了,现在看起来像这样:

TradeHelper

当我构建它时,存在问题:

Bond

正如我在this question中了解到的,没有从Instrumentclass TradeHelper { public: TradeHelper(Instrument** instPtr): _instPtr(instPtr) {} Instrument** _instPtr; }; 的隐式转换。

我猜抽象问题与我之前提到的问题非常相似:如何将指针指向派生类指针作为指针传递给基类指针鉴于我被允许假设指针会被安全使用?在上一个问题中,我找到了我在做什么错误,并且在学习之后,我觉得我需要描述我的更详细的情况,任何人都可以建议前进的方向。

Reworded,我希望对象X始终知道另一个对象Y的成员所在的“where”,但该成员是派生类,而对象X只知道基类。

我已经使用指针引用和转换进行了修改,但似乎无法找到出路。

1 个答案:

答案 0 :(得分:0)

我使用dynamic_cast重建了你的例子,我没有用这种方式构建TradeHelper的问题。有没有理由不能在代码中使用dynamic_cast?

Trader trader;
Bond b;
trader._bond = &b;
Trader* t = &trader;

Instrument* inst = dynamic_cast<Instrument*>(t->_bond);
if (inst == NULL) {
    std::cout << "dynamic_cast failed!" << std::endl;
    return 1;
}

TradeHelper* th = new TradeHelper(&inst);
delete th;