c++ - 多重继承类引用

标签 c++ class multiple-inheritance virtual-functions

假设我有一对基类:

class A
{};

class B
{
    virtual void foo(A* ref);
    virtual void foo2(A* ref);
};

从他们那里,一些派生类:

class C : virtual public A
{
   int data;
};

class D : public B
{
    virtual void foo(A* ref)
    {
        ((C*) (ref)).data = 5;
    }
};

class E : virtual public A
{
    int otherData;
};

class F : public B
{
    virtual void foo2(A* ref)
    {
        ((E*) (ref)).otherData = 6;
    }
};

最后,我们有一个类似的类,如下所示:

class G : public E, public C
{
};

主要功能如下:

int main()
{
   B* myD = new D();
   B* myF = new F();

   A* myA = new G();

   myD->foo(myA);
   myF->foo2(myA);

   return 0;
}

好吧,忽略一个明显的事实,即这是一个“可怕的钻石”(由于 virtual,“multiple As”问题已被避免),一般的想法是我想要我所有的对象都是 Gs、Ds 和 Fs,但存储为对 As 和 Bs 的引用。我希望能够使用 B(实际上总是 D 或 F)的虚函数来修改 G 的值...但是,A 和 B 不知道它们的任何子类,因此不能使用声明他们。这意味着虚函数参数必须始终是指向 A 的指针。但是,D 希望它的输入始终是 C,而 F 希望它的输入是 E。如果 G 是,这可能不是问题仅继承自一个 parent ,我们当前的 G 继承自 2 个 parent ;我不知道 this 指针在这种情况的底层上下文中实际上是如何工作的……但是,我认为这不会成为可能的情况。

是否有人愿意阐明将指针转换到父类/子类的机制,是否有任何方法可以实现这一点?

最佳答案

假设您打开了 RTTI(您很可能这样做),您可以使用 dynamic_cast 尝试将基类指针向上转换为派生(或同级)类指针。引用的对象在运行时被测试以查看它是否是一个兼容的类,如果这不是一个有效的向上转换,它将返回 0,在这种情况下您可以测试它和分支。

http://en.wikipedia.org/wiki/Dynamic_cast

关于c++ - 多重继承类引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10944106/

相关文章:

java - 继承两个Java类

java - 当我添加更多接口(interface)时,C++ 对象的大小会增加……Java 会这样做吗?

c++ - 如何最好地将私有(private)继承公开给基类?

c++ - 使用派生自 `std::get` 的元素在 `std::tuple` 上调用 `std::tuple` - 格式错误?

C++如何检查数组中的元素是否相等?

c++ - 在 STL 算法中使用模板谓词的问题

c++ - 为什么我们不能从 void* 隐式分配给 C++ 中的任何其他类型,但它在 C 中更受欢迎?

Python 类属性 - 重置

java - 如何从 if-else 语句创建/实例化对象?

java - 每次创建新客户对象时创建唯一的客户ID。这可能吗? java