在父类的向量上调用子类的方法

发布于 2024-12-02 19:59:55 字数 983 浏览 0 评论 0原文

#include <iostream>
#include <vector>

using namespace std;

class Parent {
public:
    Parent();
    void method();
};

class Child: public Parent {
public:
    Child();
    void method();
};

int main() {
    vector<Parent> v;
    v.push_back(Parent());
    v.push_back(Child());
    v[0].method();
    v[1].method();
    return 0;
}

Parent::Parent() {}

void Parent::method() {
    cout << "Parent." << endl;
}

Child::Child() {}

void Child::method() {
    cout << "Child." << endl;
}

基本上我希望该程序能够打印

Parent.
Child.

,但它却打印了这个:

Parent.
Parent.

C++ 再次让我感到惊讶:)。
为什么会出现这种情况?我该怎么做才能为向量中的 Child 实例调用 Child::method ,为 Parent 实例调用 Parent::method ?

我正在使用 gcc:

gcc version 4.6.1 20110819 (prerelease) (GCC)

像这样:

g++ -Wall -Wextra -c main.cpp
g++ -Wall -Wextra -o main main.o
#include <iostream>
#include <vector>

using namespace std;

class Parent {
public:
    Parent();
    void method();
};

class Child: public Parent {
public:
    Child();
    void method();
};

int main() {
    vector<Parent> v;
    v.push_back(Parent());
    v.push_back(Child());
    v[0].method();
    v[1].method();
    return 0;
}

Parent::Parent() {}

void Parent::method() {
    cout << "Parent." << endl;
}

Child::Child() {}

void Child::method() {
    cout << "Child." << endl;
}

Basically I'd expect that program to print

Parent.
Child.

but it prints this instead:

Parent.
Parent.

C++ surprises me yet again :).
Why does this happen? What can I do to call Child::method for instances of Child in the vector, and Parent::method for instances of Parent?

I'm using gcc:

gcc version 4.6.1 20110819 (prerelease) (GCC)

like this:

g++ -Wall -Wextra -c main.cpp
g++ -Wall -Wextra -o main main.o

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

眼波传意 2024-12-09 19:59:55

您遇到了切片问题

vector.push_back() 复制其参数,因此它调用 Parent::Parent(const Parent &) (即复制构造函数)*

这实际上与: * 没有什么不同

Parent x[10];

x[0] = Parent();
x[1] = Child();

,或者可能是 Parent::operator=(const Parent &),即复制赋值。我累了,我不记得它需要哪个。

You are encountering the slicing problem.

vector<Parent>.push_back() copies its argument, so it invokes Parent::Parent(const Parent &) (i.e. the copy constructor)*.

This is really no different to:

Parent x[10];

x[0] = Parent();
x[1] = Child();

* Or it might be Parent::operator=(const Parent &), i.e. copy-assignment. I'm tired, and I can't remember which it needs.

谜兔 2024-12-09 19:59:55

该向量存储Parent,而不是Children

如果您想利用多态性,请存储指针......但请确保这就是您想要的。

The vector stores Parents, not Childrens.

If you want to take advantage of polymorphism, store pointers instead... but be damned sure that it's what you want.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文