C++ "Virtual functions handling on multiple base classes"

标签 c++ polymorphism multiple-inheritance

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

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

#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; 
}

问题:但是在我的计算机上运行时,调用的是 FuncB() 而不是 FuncA()。如果我“翻转”父类声明,我会得到正确的结果,即

class CDerived : public CBaseA, public CBaseB

但这并不能解决我的问题,因为我不能确定将调用哪个函数。

所以我的问题是: 我做错了什么以及处理此类问题的正确方法是什么?

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

最佳答案

CBaseA* pAHandle = reinterpret_cast<CBaseA*>( &oDerived );

不要使用reinterpret_cast 来执行到基类的转换。不需要类型转换;转换是隐式的:

CBaseA* pAHandle = &oDerived;

要转换为派生类,如果已知对象是目标类型,则使用 static_cast,如果不是,则使用 dynamic_cast

您对 reinterpret_cast 的使用会产生未定义的行为,因此您会看到“奇怪”的行为。 reinterpret_cast 的正确用法很少,而且它们都不涉及类层次结构中的转换。

关于C++ "Virtual functions handling on multiple base classes",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12147070/

相关文章:

java - 泛型函数调用未在扩展多个接口(interface)的 Java 8 中编译

java - 匿名类的多重继承

C++ 多重继承设计问题

c++ - fork 创建的进程作为父进程的拷贝有什么意义?

c++ - C++ vector<bool>的内存分配

c++ - 如何在cocos2d-x中制作一个可以包含在HelloWorld.cpp中的Layer文件...?

堆栈上的 C++ 流多态性?

c++ - 使用函数指针推迟函数执行

c# - 用派生类覆盖基类的属性

scala - 在 Scala 中使用类型成员来减少类型冗长是否可行?