在将派生类指针转换为基类时,基类有歧义
base class ambiguous when converting derived class pointer to base class
我用的是c++。当我尝试转换派生类的"指针到基类"时,编译器抱怨"基类是模糊的"。
我做了一些研究,发现了这个问题,我如何在使用多重继承时避免死亡之钻?和其他一些类似的问题。
有一个解决方案,就是使用virtual inheritance
。但是我不能改变类的定义,因为它们是编译过的库。
是否可以在不改变基类定义的情况下进行转换?
一个最小的例子是:
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};
我想做的是:
D *d = new D;
A *a = (D *)d; // ambiguous
是否可以在不改变基类定义的情况下进行转换?
是的。您必须选择要通过哪个直接基类。
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};
void foo(A&) {}
int main() {
D d;
foo(static_cast<B&>(d));
foo(static_cast<C&>(d));
return 0;
}
我找到了一种方法来进行这种转换,尽管有点棘手。
下面的代码可以完成这项工作:
A *a = (B *)d;
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 为什么此派生对象无法访问基类的后递减方法?
- 公开最直接的基类模板名称
- 当基类是依赖类型时,这是一个缺陷吗
- 警告:由于歧义而导致的直接基类无法访问;这是严重的
- 在将派生类指针转换为基类时,基类有歧义
- 在类模板中消除基类名称的歧义
- 多重继承歧义基类