C++多重继承和交叉委托与 void*
C++ multiple inheritance and cross delegation with void*?
class Base1
{
public:
virtual ~Base1(){}
virtual void whatever()
{
cout << "whatever" << endl;
}
};
class Base2
{
public:
virtual ~Base2(){}
virtual void aFunc(int i) = 0;
};
class A : public Base1, public Base2
{
public:
A()
{}
~A()
{}
virtual void aFunc(int i) final
{
cout << "func" << endl;
}
};
int main()
{
void* a;
a = new A();
(static_cast<Base2*>(a))->aFunc(0);
Base2* ptr = static_cast<Base2*>(a);
ptr->aFunc(0);
return 0;
}
此示例打印出"whatever"而不是"func",如果我将带有 void* 的行更改为 A*,则打印出"func"。这是已知行为吗?我希望是这种情况,只是不知道为什么。
这是已知行为吗?
是的。如果您转换为void*
然后又转换回相同的类型,则行为是明确定义的。如果转换回其他类型,则未定义。
不能保证基子对象我希望是这种情况,只是不知道为什么。
与完整对象具有相同的地址;事实上,如果有多个非空基类,则至少有一个子对象必须位于不同的地址。因此,从 A*
到 Base2*
的有效转换可能需要调整指针的值,而不仅仅是将其重新解释为不同的类型。转换为void*
和返回无法进行该调整。
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- 多重继承导致虚假的模糊虚拟函数过载
- 多重继承和访问不明确的元素
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- 为什么我的 Hippomock 期望在使用多重继承时失败
- 带有此指针的模板类多重继承构造函数不起作用?
- 使用多重继承时出现编译错误
- 增强多重继承的序列化
- 多重继承:跳过'virtual'关键字并拒绝菱形层次结构的使用?
- 仅函数的多重继承 - 没有虚拟和 CRTP
- C++多重继承和鸭子类型
- C++两次从文件保存对象读取多重继承
- 将void*强制转换为具有多重继承的类
- C++多重继承和交叉委托与 void*