虚拟派生和转换模棱两可
virtual derivation & conversion ambiguous
我现在正在学习C++虚拟推导中的不同歧义情况。但是我的代码中有一个歧义错误,我不明白这是原因......
这是我的代码:
class V {
public:
int v ;
};
class A {
public:
int a ;
};
class B : public A, public virtual V {
};
class C : public A, public virtual V {
};
class D : public B, public C {
public:
void f() ;
};
void g() {
D d ;
B* pb = &d ; // No Problem
A* pa = &d ; // Error: 'A' is ambiguous base of 'D'
V* pv = &d ; // No Problem
}
我不明白为什么我有这个错误,但是我没有其他影响的错误。
谢谢 :-)
在多重继承的情况下,这是完全意料之中的。我们这里有一个钻石继承的案例。D 现在有两个 A 副本,一个继承自 B,一个继承自 C。您需要指定暴露于 D 的 A 成员来自哪个 B 或 C。
请参阅:使用 C++,如何正确从同一基类继承两次?
您可以考虑:
-
使用虚拟继承:
class B : public virtual A, public virtual V {...};
class C : public virtual A, public virtual V {...};
-
使用组合作为摆脱多重继承的出路。
我建议阅读 用虚拟继承解决钻石问题
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 将 NULL 转换为长不是模棱两可吗?
- 将一组类转换为类模板并避免构造函数模棱两可
- 转换和移动 ctor 导致对 Clang 和 GCC 4.9.2 的模棱两可的要求
- 转换是模棱两可的.标准隐式转换无法选择强制转换运算符
- 虚拟派生和转换模棱两可
- dynamic_cast中的模棱两可的转换
- 从'QTableWidgetItem* const'到'QChar'的转换..或问...模棱两可
- 处理模棱两可的类型转换/转换的正确方法是什么?