【发布时间】:2019-03-29 01:16:53
【问题描述】:
我是 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();
感谢任何可以提供帮助的人!
编辑:事实证明,无论我尝试修复语法多少次,我的问题都没有任何意义。不能像那样在父级上调用纯虚函数。后来我发现我正在寻找的代码在调用该函数之前确实将父类设置为它的一个子类(定义了虚函数)的成员......我之前只是错过了它。
【问题讨论】:
-
你不能实例化
Parent,因为它是抽象的。如果您尝试,编译器会抱怨。而Parent p = a将导致 object slicing (可能还有编译器错误)。我想你的意思是Parent *p = &a或类似的。 -
你完全正确。编辑以解决该问题和其他问题。好久没用过C了,现在才学C++,很多这些看似很小的细节都让我头疼。
-
Child_A a = new Child_A();应该是Child_A * a = new Child_A();(因为new返回一个指针,你不能将指针分配给非指针)然后Parent *p = &a;变成Parent *p = a;或者你可以直接切换到Parent *p = new Child_A(); -
另外,C++ 不是 Java。使用
std::make_unique<Type>而不是new Type();。后者必然会在未来引起重大问题,因为 new 表明您个人负责管理与对象关联的内存。 -
就在@Isaiah 的页面上,并且会更进一步。您会发现几乎完全使用自动变量而不使用动态分配有很大的优势。一般来说,偏好应该按顺序排列:Automatic Variable、Library container 或 Smart pointer、
new、malloc和家人。
标签: c++ inheritance polymorphism