我是C ++的新手,在最近使用的某些代码中遇到了一个有趣的问题。假设我们有以下类别:Parent
,Child_A
,Child_B
和Child_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();
感谢任何可以提供帮助的人!
编辑:事实证明,无论我尝试修复语法多少次,我的问题都没有任何意义。不能像这样在父对象上调用纯虚函数。后来我发现,我要查找的代码在调用该函数之前确实将父级设置为其子级之一(定义了虚函数)的成员……我以前错过了它。
答案 0 :(得分:2)
尽管您的类不是从父类继承的,但您对C ++语法还是有一些误解。
当您声明一个像void foo() = 0
这样的成员函数时,您是在说您的函数尚未实现,并且使类成为抽象类,并且无法实例化一个抽象类。一个纯虚函数并不意味着“返回0”。
答案 1 :(得分:1)
如果希望能够实例化父级,则可以将函数设为虚拟(而非纯虚拟),然后让子级覆盖该函数。