- 此问题在此处已有答案**:
(18个答案)
昨天关门了。
我有这个简单的测试代码:
class father{
public:
father()= default;
virtual void func(){
cout <<"father" << endl;
}
};
class child:public father{
public:
child() = default;
void func(){
cout << "child" << endl;
}
};
int main(){
father* fptr = new child;
auto s = *fptr; //why type of s will be father?
(*fptr).func(); //child
s.func(); //father
return 0;
}
我不知道为什么类型s会是father
,如果解引用一个指针可以消除多态性,为什么(*fptr).func();
工作正常?
3条答案
按热度按时间ioekq8ef1#
因为
fptr
是指向father
的指针,所以s
的推导类型将是father
,并且你会得到对象的
father
部分的副本。但是在表达式
(*fptr).func()
中,(*fptr)
的结果是一个 reference(更确切地说是一个右值引用),多态性要么通过指针,要么通过引用。或
都能让你的计划成功。
snvhrwxg2#
fptr
是指向father
的指针。当它指向的实际对象是
child
,但类型仍然是father*
时,可以将它用于多态调用。因此,表达式
*fptr
是father
类型,并且这是针对s
推导的类型。*fptr
的类型为右值reference,但由于reference不作为auto
的一部分导出,除非明确指定,因此s
的类型被导出为father
)*。任务:
因此复制到新对象
s
中:由
fptr
指向的实际child
被切片并复制到s
中。关于
(*fptr).func()
:看"某个程序员老兄"的回答。
bjp0bcyl3#
扩大至
fptr
所指向的对象将被复制到s
中,s
只是一个Father
类型的对象,不包含child
的任何附加信息,称为object slicing。