Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
虚拟函数c++; 我有1个关于C++虚函数的问题…p> class base{ public : base() { a=5;} int a; virtual void print()=0; int get(){return a;} int get_var(){ a=5; return a;} }; int main(void){ base *p; cout <<"Get Call - No assign\n"; cout <<"Value is :: "<<p->get()<<endl; cout <<"Get Call - assign value\n"; cout <<"Value is :: "<<p->get_var()<<endl; return 0; } 类基{ 公众: base(){a=5;} INTA; 虚空打印()=0; int get(){返回一个;} int get_var(){a=5;返回a;} }; 内部主(空){ 碱基*p; 根本原因:_C++_Polymorphism - Fatal编程技术网

虚拟函数c++; 我有1个关于C++虚函数的问题…p> class base{ public : base() { a=5;} int a; virtual void print()=0; int get(){return a;} int get_var(){ a=5; return a;} }; int main(void){ base *p; cout <<"Get Call - No assign\n"; cout <<"Value is :: "<<p->get()<<endl; cout <<"Get Call - assign value\n"; cout <<"Value is :: "<<p->get_var()<<endl; return 0; } 类基{ 公众: base(){a=5;} INTA; 虚空打印()=0; int get(){返回一个;} int get_var(){a=5;返回a;} }; 内部主(空){ 碱基*p; 根本原因:

虚拟函数c++; 我有1个关于C++虚函数的问题…p> class base{ public : base() { a=5;} int a; virtual void print()=0; int get(){return a;} int get_var(){ a=5; return a;} }; int main(void){ base *p; cout <<"Get Call - No assign\n"; cout <<"Value is :: "<<p->get()<<endl; cout <<"Get Call - assign value\n"; cout <<"Value is :: "<<p->get_var()<<endl; return 0; } 类基{ 公众: base(){a=5;} INTA; 虚空打印()=0; int get(){返回一个;} int get_var(){a=5;返回a;} }; 内部主(空){ 碱基*p; 根本原因:,c++,polymorphism,C++,Polymorphism,您的指针p没有指向任何有效对象,因此当您通过调用其上的成员函数来解除限制时会发生崩溃(实际上这是一种未定义的行为) 当您声明一个指针只指向任何随机地址时,您的责任是使它指向一个有效的对象,以便能够使用指针执行任何有意义的操作 解决方案: 你需要: base *p = new base; 或 要使上述任何一种方法起作用,base必须是非抽象类。在您的示例中,base是一个抽象类(至少有一个纯虚函数的类),对于这样的类,您不能创建它的任何对象(调用其构造函数)。 因此,要解决这个问题,您需要创建

您的指针
p
没有指向任何有效对象,因此当您通过调用其上的成员函数来解除限制时会发生崩溃(实际上这是一种未定义的行为

当您声明一个指针只指向任何随机地址时,您的责任是使它指向一个有效的对象,以便能够使用指针执行任何有意义的操作

解决方案:

你需要:

base *p = new base; 

要使上述任何一种方法起作用,
base
必须是非抽象类。在您的示例中,
base
是一个抽象类(至少有一个纯虚函数的类),对于这样的类,您不能创建它的任何对象(调用其构造函数)。
因此,要解决这个问题,您需要创建一个派生类,该派生类派生自抽象类
base
,然后为派生类实现纯虚拟函数
print()
,从而使派生类成为一个具体类而非抽象类。然后您可以在工作中查看动态分派(我猜那是你的目标)


根本原因:

您的指针
p
没有指向任何有效对象,因此当您通过调用其上的成员函数来解除限制时会发生崩溃(实际上这是一种未定义的行为

当您声明一个指针只指向任何随机地址时,您的责任是使它指向一个有效的对象,以便能够使用指针执行任何有意义的操作

解决方案:

你需要:

base *p = new base; 

要使上述任何一种方法起作用,
base
必须是非抽象类。在您的示例中,
base
是一个抽象类(至少有一个纯虚函数的类),对于这样的类,您不能创建它的任何对象(调用其构造函数)。
因此,要解决这个问题,您需要创建一个派生类,该派生类派生自抽象类
base
,然后为派生类实现纯虚拟函数
print()
,从而使派生类成为一个具体类而非抽象类。然后您可以在工作中查看动态分派(我猜那是你的目标)


您没有初始化
base*p;
,因此对其调用方法是未定义的行为(在您的情况下是segfault)


另一方面,无法初始化它,因为
base
是一个抽象类。您必须在
base
或派生类中提供
print
的定义。

您没有初始化
base*p;
,因此对其调用方法是未定义的行为(在您的案例中是一个segfault)

另一方面,无法初始化它,因为
base
是一个抽象类。必须在
base
或派生类中提供
print
的定义

我能想到的一个原因是——因为基类是抽象类,也就是说,没有完整的实现,所以当我做a=5时,它会崩溃

否,崩溃是由取消引用统一化指针
p
(技术上未定义的行为)引起的。由于
base
是抽象的,因此无法创建它的实例:

base b;             // Illegal
base* p = new base; // Illegal 
在发布的代码中没有派生的具体类。您需要从
base
派生并实现纯虚拟函数
print()

我能想到的一个原因是——因为基类是抽象类,也就是说,没有完整的实现,所以当我做a=5时,它会崩溃

否,崩溃是由取消引用统一化指针
p
(技术上未定义的行为)引起的。由于
base
是抽象的,因此无法创建它的实例:

base b;             // Illegal
base* p = new base; // Illegal 

在发布的代码中没有派生的具体类。您需要从
base
派生并实现纯虚拟函数
print()

p
是一个未初始化的指针。因此,使用它做任何事情都是未定义的行为


“为什么它没有更早崩溃”的答案通常是“运气”(好的或坏的,取决于你的观点)。一个行为未定义的程序可以做任何事情:看起来工作、崩溃、让你的鼠标爆炸等等。

p
是一个未初始化的指针。所以用它做任何事情几乎都是未定义的行为


“为什么它没有更早崩溃”的答案通常是“运气”(好或坏,取决于你的看法).一个行为未定义的程序可以做任何事情:似乎工作、崩溃、让你的鼠标爆炸等等。

@LuchianGrigore:帮助一个新用户使用共振峰并提示将来如何做并不是那么难。-1对你!@DavidRodríguez dribeas我通常这样做,我试着编辑自己。但代码不仅不适合我我写了格式化的代码,但是他们不接受,因为我很早就需要同样的代码,我想-4不需要done@Anshulgarg您可以键入代码纯文本,然后单击
{}
图标。只需确保普通文本和代码之间有空行即可。@juanchopanza谢谢您提供的信息,:-)@LuchianGrigore:帮助新用户使用共振峰并提示将来如何使用共振峰并不难。-1给你!@DavidRodríguez dribeas我通常这样做,我试着编辑自己。但代码不仅没有格式化,而且都写在一行上。一行,老兄!我写了格式化代码,但他们不接受这样的修改接受我需要的一切