C++"在多个基类上处理虚函数"

use*_*282 2 c++ polymorphism multiple-inheritance

我需要派生子类将CDerived从两个不同的基类CBaseACBaseB.

另外,我需要在派生类上调用父对象的虚函数.由于我想稍后在一个向量中管理不同类型的对象(这不是这个最小代码示例的一部分),我需要从基类指针调用虚函数到派生类对象:

#include <iostream>
#include <stdlib.h>

class CBaseA
{
  public:
    virtual void FuncA(){ std::cout << "CBaseA::FuncA()" << std::endl; };
};

class CBaseB
{
  public:
    virtual void FuncB(){ std::cout << "CBaseB::FuncB()" << std::endl; };
};

class CDerived : public CBaseB, public CBaseA
{};

int main( int argc, char* argv[] )
{
  // An object of the derived type:
  CDerived oDerived;

  // A base class pointer to the object, as it could later
  // be stored in a general vector:
  CBaseA* pAHandle = reinterpret_cast<CBaseA*>( &oDerived );

  // Calling method A:
  pAHandle->FuncA();

  return 0; 
}
Run Code Online (Sandbox Code Playgroud)

问题:但是当在我的计算机上运行它时,调用FuncB()而不是FuncA().如果我"翻转"父类的deklarations,即得到正确的结果,即

class CDerived : public CBaseA, public CBaseB
Run Code Online (Sandbox Code Playgroud)

但这并没有解决我的问题,因为我无法确定将调用哪个函数.

所以我的问题是: 我做错了什么以及处理这样一个问题的正确方法是什么?

(顺便说一句,我使用的是g ++ 4.6.2)

Jam*_*lis 7

CBaseA* pAHandle = reinterpret_cast<CBaseA*>( &oDerived );
Run Code Online (Sandbox Code Playgroud)

不要reinterpret_cast用于执行到基类的转换.不需要演员阵容; 转换是隐含的:

CBaseA* pAHandle = &oDerived;
Run Code Online (Sandbox Code Playgroud)

要转换为派生类,请使用static_cast该对象是否为目标类型,或者dynamic_cast不是.

您使用reinterpret_castyield未定义的行为,因此您看到的"奇怪"行为.几乎没有正确的用法,reinterpret_cast它们都不涉及类层次结构中的转换.