C ++:调用父

时间:2016-12-23 22:17:40

标签: c++ polymorphism

#include <iostream>

using namespace std;

struct A
{
    virtual int func(void) { return 0; }
};

struct B : A
{
    int func(void) { return 1; }
};

int main()
{
    A b = B();
    cout << b.func() << endl;
}

我希望输出为1,但大多数人都会知道它的0

我想在实际代码中实现的是这些内容。

struct A
{
     virtual int operator() (int i);
};
struct B : A
{
     int operator() (int i) { return i*2; }
};
struct C : A
{
     int operator() (int i) { return i*3; }
};
struct x
{
     A test;
};

因此,我的容器无法预先判断它是否会包含ABC,但其行为应该不同。

有没有办法实现我预期的功能?

2 个答案:

答案 0 :(得分:4)

A b = B();:您正在构建A类型的对象,使用来自B对象的赋值运算符/复制构造函数(通过复制省略),但看作是对A的引用(这解释了为什么编译没有错误)

这不是多态性。 b仍为A类型。 B的链接已丢失。

那会这样做:

A *b = new B();

现在

cout << b->func() << endl;

触发多态/虚函数并按预期产生1。

答案 1 :(得分:2)

C ++虚函数仅适用于引用/指针,这意味着间接。

A b = B();

这会创建一个类型A的对象,而不是类型B.没有间接,因此只调用A中的函数。