假设我们有以下类(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 ,因此我必须坚持下去,因此我需要兼容的解决方案,但是在以后的标准中可能会有更好的解决方案,因此出于我的知识,您仍然可以共享这些解决方案。
编辑:阅读评论后,以下是对我的问题的进一步说明
B
和BB
的定义无法更改,就像无法修改的API中的类一样。直接强制转换是调用构造函数并创建一个新对象,这不是我想要的,因此它需要如答案中所述的间接寻址。
给定另一类:
class Cbis: public A, public BB<float>
{
public:
Cbis() {}
};
D
类的唯一目的是允许将C
和Cbis
引用存储在同一容器中,并且能够访问A
和B
类中的方法。最后,因为
D
不是基类,所以即使对于祖先也根本不可能。因此,有什么替代方案?除了存储在两个单独的容器中外,一个基于
A
指针和on B
指针。 最佳答案
需要间接访问以获得运行时多态性。
如果C
对象是间接引用的,则您可以对dynamic_cast
引用(指针)的引用(或指针)进行D
,因为它们具有共同的祖先(具有虚函数)。当且仅当C
对象是也继承了D
的派生类的基础时,转换成功。如果不是这种情况,dynamic_cast
将安全地失败。
添加一个转换构造函数将使类型(如果构造函数不是explicit
,则是隐式的)可以转换为另一个类型。使用这种构造函数,可以使用static_cast
显式完成转换。重要的是要理解转换结果(从C
到D
)不再是C
对象。