假设我们有以下类(class):

class A
{
public:
   A() {}

};

class B
{
public:
   B() {}
   virtual ~B() {}
};

template<typename T>
class BB: public B
{
public:
    BB() {}
};

class C: public A, public BB<bool>
{
public:
    C() {}
};

class D: public A, public B
{
public:
    D() {}
};

是否可以/允许/安全将C对象转换为类类型D?为了访问非模板化的东西并使用多态性。

我尝试并得到错误no matching function for call to 'D::D(C&)'

添加构造函数D::D(C& c): A(c), B(c) {}就足够了吗?

请注意,我目前正在使用 C++ 11 ,因此我必须坚持下去,因此我需要兼容的解决方案,但是在以后的标准中可能会有更好的解决方案,因此出于我的知识,您仍然可以共享这些解决方案。

编辑:阅读评论后,以下是对我的问题的进一步说明
BBB的定义无法更改,就像无法修改的API中的类一样。

直接强制转换是调用构造函数并创建一个新对象,这不是我想要的,因此它需要如答案中所述的间接寻址。

给定另一类:
class Cbis: public A, public BB<float>
{
public:
    Cbis() {}
};
D类的唯一目的是允许将CCbis引用存储在同一容器中,并且能够访问AB类中的方法。

最后,因为D不是基类,所以即使对于祖先也根本不可能。

因此,有什么替代方案?除了存储在两个单独的容器中外,一个基于A指针和on B指针。

最佳答案



需要间接访问以获得运行时多态性。

如果C对象是间接引用的,则您可以对dynamic_cast引用(指针)的引用(或指针)进行D,因为它们具有共同的祖先(具有虚函数)。当且仅当C对象是也继承了D的派生类的基础时,转换成功。如果不是这种情况,dynamic_cast将安全地失败。



添加一个转换构造函数将使类型(如果构造函数不是explicit,则是隐式的)可以转换为另一个类型。使用这种构造函数,可以使用static_cast显式完成转换。重要的是要理解转换结果(从CD)不再是C对象。

09-09 23:23
查看更多