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函数。当设定者返回临时人类消失时,可怜的狗主人指针无效
因此,请务必阅读警告。如果你不理解它们,就认为它们是错误的。
另一个问题-避免构造函数元素和成员具有相同的名称,否则总有一天你会很难学会这条规则