继承和隐式类型转换
Inheritance and Implicit Type Casting
假设我有以下三个类:
class Animal {};
class Human : public Animal {};
class Dog : public Animal
{
public:
void setOwner(Animal* owner) { this->owner = owner; }
private:
Animal* owner;
};
为什么允许以下内容,究竟发生了什么?
Dog d;
Human h;
d.setOwner(&h); // ?
起初,我试图像这样d.setOwner(&(Animal)h)
投射它,但编译器给了我一个警告,我遇到了运行时错误。
编辑:编译器给我的警告是"临时地址"。为什么会这样?
这里 d.setOwner((Animal)&h)
您尝试将指针类型大小写为对象类型。你不能这样做。
投射到动物类的正确方法是
d.setOwner((Animal*)&h)
但是你
这
d.setOwner(&h);
之所以有效,是因为如果需要,C++中的指针会自动强制转换为基类。不需要显式转换为动物*。
没有类型转换,但Human
是Animal
。因此,任何作用于Animal*
的接口都将接受Human*
。这同样适用于Animal&
和Human&
。当然,他们只能看到对象界面的Animal
部分。
由于其他人已经离开了,因此没有必要将派生*转换为base*
但没有人回答警告的问题。是的,创建了一个临时动物。而不是投射指针,而是将对象本身从人类所有者投射到动物。这导致从人类主人那里创造了一个临时动物。此临时地址已传递给 SET 函数。当二传手返回临时人类消失者时,可怜的狗主人指针无效。
因此,请务必阅读警告。 如果您不理解它们,请将它们视为错误。
另一个问题 - 避免构造函数元素和成员具有相同的名称,否则有一天你会以艰难的方式学习这个规则。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 事件系统:使用类型转换或联合进行继承
- 继承和隐式类型转换
- 继承结构的类型转换导致g++编译错误
- QObject基类到继承对象的C++类型转换
- 为什么显式类型转换允许对私有继承进行向上转换
- C++中的类型转换和继承
- 多重继承c++,如何进行类型转换
- 多重继承和强制类型转换
- 为什么类型转换运算符不适用于继承的类?
- 基于继承的c++强制类型转换