C++ 继承和隐式类型转换

C++ 继承和隐式类型转换,c++,C++,假设我有以下三个类: 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); // ?

假设我有以下三个类:

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((动物)和h)

您尝试将指针类型大小写为对象类型。你不能这样做

正确的动物等级铸造方法是

d.setOwner((Animal*)&h)
但是你

这个

是因为如果需要,C++中的指针自动转换为基类。不需要显式转换为Animal*。

此处 d、 setOwner((动物)和h)

您尝试将指针类型大小写为对象类型。你不能这样做

正确的动物等级铸造方法是

d.setOwner((Animal*)&h)
但是你

这个


是因为如果需要,C++中的指针自动转换为基类。不需要显式转换为Animal*。

因为其他人已经指出,不需要将派生的*转换为base*

但是没有人回答这个警告的问题。 是的,有一种临时动物被创造出来了。你没有使用指针,而是将对象本身从人类所有者投射到动物身上。这导致人类主人创造了一个临时动物。此临时文件的地址已传递给set函数。当设定者返回临时人类消失时,可怜的狗主人指针无效

因此,请务必阅读警告。如果你不理解它们,就认为它们是错误的。
另一个问题-避免构造函数元素和成员具有相同的名称,否则总有一天你会很难学会这条规则。

正如其他人所说的,没有必要将派生的*转换为基*

但是没有人回答这个警告的问题。 是的,有一种临时动物被创造出来了。你没有使用指针,而是将对象本身从人类所有者投射到动物身上。这导致人类主人创造了一个临时动物。此临时文件的地址已传递给set函数。当设定者返回临时人类消失时,可怜的狗主人指针无效

因此,请务必阅读警告。如果你不理解它们,就认为它们是错误的。 另一个问题-避免构造函数元素和成员具有相同的名称,否则总有一天你会很难学会这条规则