当对声明纯虚函数的父类的实例调用纯虚函数时会发生什么情况? 我是C++新手,最近在一些代码中遇到了一个有趣的问题。假设我们有以下类:Parent,Child\u A,Child\u B,和Child\u 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; } ... }

当对声明纯虚函数的父类的实例调用纯虚函数时会发生什么情况? 我是C++新手,最近在一些代码中遇到了一个有趣的问题。假设我们有以下类:Parent,Child\u A,Child\u B,和Child\u 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; } ... },c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,现在我知道如果我这样做会发生什么: std::unique_ptr<Child_A> a = std::make_unique<Child_A>(); Parent *p = &a; p->Foo(); std::unique_ptr<Parent> p = std::make_unique<Parent>(); p->Foo(); std::unique_ptr a=std::make_unique(); 家长*p=&a;

现在我知道如果我这样做会发生什么:

std::unique_ptr<Child_A> a = std::make_unique<Child_A>();
Parent *p = &a;
p->Foo();
std::unique_ptr<Parent> p = std::make_unique<Parent>();
p->Foo();
std::unique_ptr a=std::make_unique();
家长*p=&a;
p->Foo();
这将返回1。但我的问题是,如果我这样做会发生什么:

std::unique_ptr<Child_A> a = std::make_unique<Child_A>();
Parent *p = &a;
p->Foo();
std::unique_ptr<Parent> p = std::make_unique<Parent>();
p->Foo();
std::unique_ptr p=std::make_unique();
p->Foo();
感谢所有能帮忙的人


Edit:不管我尝试了多少次修改语法,我的问题都毫无意义。纯虚函数不能像那样在父函数上调用。后来我发现,在我调用的代码之前,它的父类等于它的子类中的一个成员(具有虚拟函数定义),在调用函数之前……我刚才错过了。< /强>

< p>您对C++语法有点误解,尽管您的类不继承父类。


当您声明这样的成员函数时,
void foo()=0
,您的意思是您的函数没有实现,您正在使类抽象,并且您无法实例化抽象类。纯虚拟函数并不意味着“返回0”。

如果您希望能够实例化父函数,可以将该函数设置为虚拟函数(非纯虚拟函数),然后让子函数重写该函数。

您不能实例化父函数,因为它是抽象的。如果你尝试,编译器会抱怨。并且
Parent p=a
将导致对象切片(可能还有编译器错误)。我想你的意思是
Parent*p=&a
或类似的。你完全正确。编辑以修复该问题和其他问题。我暂时还没有使用C,现在我正在学习C++,所以很多看起来很小的细节都会让我感到困惑。<代码> Positha A= NealCudioA()代码>应该是
Child_A*A=新的Child_A()
(因为
new
返回一个指针,而您不能将指针分配给非指针)然后
Parent*p=&a变为
父*p=a
或者你可以直接切入到
Parent*p=new Child_A()也是,C++不是java。使用
std::make_unique
代替
new Type()。后者必然会在未来引起重大问题,因为新的内容表明您个人负责管理与该对象相关的内存。请参见第页的@Isaiah,并将更进一步。您会发现,几乎完全使用自动变量而不使用任何动态分配有很大的优势。一般来说,首选项的顺序应该是:,或者,
new
malloc
和family。谢谢你的回答。