c++ 为什么解引用多态指针将获得指针的类型而不是对象的类型?[duplicate]

zvms9eto  于 2023-01-22  发布在  其他
关注(0)|答案(3)|浏览(153)
    • 此问题在此处已有答案**:

(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();工作正常?

ioekq8ef

ioekq8ef1#

因为fptr是指向father的指针,所以s的推导类型将是father,并且

auto s = *fptr;

你会得到对象的father部分的副本。
但是在表达式(*fptr).func()中,(*fptr)的结果是一个 reference(更确切地说是一个右值引用),多态性要么通过指针,要么通过引用。

auto& s = *fptr;

auto&& s = *fptr;

都能让你的计划成功。

snvhrwxg

snvhrwxg2#

fptr是指向father的指针。
当它指向的实际对象是child,但类型仍然是father*时,可以将它用于多态调用。
因此,表达式*fptrfather类型,并且这是针对s推导的类型。

  • (更准确地说:*fptr的类型为右值reference,但由于reference不作为auto的一部分导出,除非明确指定,因此s的类型被导出为father)*。

任务:

auto s = *fptr;

因此复制到新对象s中:
fptr指向的实际child被切片并复制到s中。
关于(*fptr).func()
看"某个程序员老兄"的回答。

bjp0bcyl

bjp0bcyl3#

auto s = *fptr;

扩大至

Father s = *fptr;

fptr所指向的对象将被复制到s中,s只是一个Father类型的对象,不包含child的任何附加信息,称为object slicing

相关问题