在没有指针/引用的情况下,多态是否可以在C ++中工作? [英] Does polymorphism work in C++ without pointers / references?

查看:119
本文介绍了在没有指针/引用的情况下,多态是否可以在C ++中工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可能重复:
虚拟函数对象切片

Possible Duplicate:
Virtual Functions Object Slicing

让我们考虑一下:

#include <vector>
#include <iostream>
using namespace std;

struct A {
    virtual void do_it() { cout << "A" << endl; } 
};

struct B : public A {
    virtual void do_it()  { cout << "B" << endl; } 
};

int main() {
    vector<A> v;
    v.push_back(B());
    v[0].do_it(); // output is A
}

将调用哪个函数?基本上,如果不存在切片,是否可以在不使用指针的情况下使用多态性?

which function will be called? Basically is it possible to use polymorphism without pointers if no slicing is present?

推荐答案

否,没有指针将无法实现.

No it will not be possible without pointers.

由于创建了对象B并将其推入包含A的向量,它将被复制(发送到A的复制构造函数),并且A的实例将被添加到向量中. IE.该对象将被切片.

Since you create an object B and push it to the vector containing A, it will get copied (sent to the copy constructor of A) and an instance of A will be added to the vector. I.e. the object will be sliced.

给出以下代码:

struct A {
        virtual void d() { 
            std::cout << "Hello A" << std::endl; 
        } 
};

struct B : public A {
        virtual void d() { 
            std::cout << "Hello B" << std::endl; 
        } 
};

int main() {
        std::vector<A> v;
        v.push_back(B());
        v[0].d();
}

输出将是:

Hello A

这篇关于在没有指针/引用的情况下,多态是否可以在C ++中工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆