gpt4 book ai didi

c++ - 转换为非基类但具有共同的祖先

转载 作者:搜寻专家 更新时间:2023-10-31 00:27:15 26 4
gpt4 key购买 nike

假设我们有以下类:

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 是否可能/允许/安全?这是为了访问非模板化的东西并使用多态性。

我尝试并得到错误没有匹配函数调用'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 指针,另一个基于 B 指针。

最佳答案

Do casting a C object to class type D is possible/allowed/safe ? This in order to access non templated stuff and use polymorphism.

间接 是获得运行时多态性所必需的。

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

Do adding the constructor D::D(C& c): A(c), B(c) {} will suffice to do so ?

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

关于c++ - 转换为非基类但具有共同的祖先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49794613/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com