在声明了父类的实例上调用纯虚函数时会发生什么?

时间:2019-03-29 01:16:53

标签: c++ inheritance polymorphism

我是C ++的新手,在最近使用的某些代码中遇到了一个有趣的问题。假设我们有以下类别:ParentChild_AChild_BChild_C

class Parent {
    ...
    virtual int Foo() = 0;
    ...
}


class Child_A : Parent {
    ...
    int Foo() { return 1; }
    ...
}

class Child_B : Parent {
    ...
    int Foo() { return 2; }
    ...
}

class Child_C : Parent {
    ...
    int Foo() { return 3; }
    ...
}

现在,我知道如果执行此操作会发生什么情况:

std::unique_ptr<Child_A> a = std::make_unique<Child_A>();
Parent *p = &a;
p->Foo();

那将返回1。但是我的问题是,如果我这样做会发生什么:

std::unique_ptr<Parent> p = std::make_unique<Parent>();
p->Foo();

感谢任何可以提供帮助的人!

编辑:事实证明,无论我尝试修复语法多少次,我的问题都没有任何意义。不能像这样在父对象上调用纯虚函数。后来我发现,我要查找的代码在调用该函数之前确实将父级设置为其子级之一(定义了虚函数)的成员……我以前错过了它。

2 个答案:

答案 0 :(得分:2)

尽管您的类不是从父类继承的,但您对C ++语法还是有一些误解。

当您声明一个像void foo() = 0这样的成员函数时,您是在说您的函数尚未实现,并且使类成为抽象类,并且无法实例化一个抽象类。一个纯虚函数并不意味着“返回0”。

答案 1 :(得分:1)

如果希望能够实例化父级,则可以将函数设为虚拟(而非纯虚拟),然后让子级覆盖该函数。