今天在写一个工厂类的时候出现了一个问题,就是基类定义成为抽象类,派生类继承基类后,并进行具体的定义,结果用工厂类实例化的时候报错了。
基类代码如下:
class BaseClass
public:
virtual double Add(double DataA, double DataB) = 0;
virtual double Min(double DataA, double DataB) = 0;
virtual double Mul(double DataA, double DataB) = 0;
virtual double Div(double DataA, double DataB) = 0;
派生类定义部分如下:
double AddClass::Add(double DataA, double DataB)
double Num;
Num = DataA + DataB;
return Num;
工厂类实例化如下:
BaseClass* Factory::factoryadd()
return new AddClass;
结果报错,错误为C2259 “AddClass” 无法实例化抽象类
其实这个问题为基类定义成了抽象类,而派生类继承了基类的所有的函数,但却只对基类中的其中一个虚函数进行了定义,其余的虚函数还是处于未定义状态,故而报错。
修改方法也很简单,如下,
在基类中更改:
class BaseClass
virtual double Add(double DataA, double DataB) { return 0; }
virtual double Min(double DataA, double DataB) { return 0; }
virtual double Mul(double DataA, double DataB) { return 0; }
virtual double Div(double DataA, double DataB) { return 0; }
给基类当中默认实现即可。
笨方法,基类不变,派生类变为:
double AddClass::Add(double DataA, double DataB)
double Num;
Num = DataA + DataB;
return Num;
double AddClass::Min(double DataA, double DataB)
return 0;
double AddClass::Mul(double DataA, double DataB)
return 0;
double AddClass::Div(double DataA, double DataB)
return 0;
及在派生类当中将基类所有未定义的,全部定义一遍。
建议用第一种方法,因为用工厂类就是为了方便,易于修改,第二种可以当作验证。
本人水平有限,如有问题,请多指教。
今天在写一个工厂类的时候出现了一个问题,就是基类定义成为抽象类,子类继承后,并进行具体的定义,结果用工厂类实例化的时候报错了。基类代码如下:class BaseClass{ virtual double Add(double DataA, double DataB) = 0; virtual double Min(double DataA, double DataB) = 0; virtual double Mul(double DataA, double DataB) = 0; virtua
错误 1 error C2259: “LinearList”: 不能实例化抽象类 e:\datastructure\cap_1\cap_1\linearlist.h 22 1 Cap_1
数据结构中经常会报上面的错误,就是在自己信心满满测试自己写好的继承的抽象基类的时候,在main函数中定义对象的时候竟然报错,通过这篇文章,希望大家都能解决并记住!
根本原因是违背了C++的语法,用抽象类实
实例化类对象的时候,提示不能
实例化抽象类
1、创建
类class的时候,只要有一个未
实例化的虚函数,那么本
类即为
抽象类,不将该虚函数实现,是
无法创建该
类的。
2、还有
可能是继承的基
类中有虚函数没有实现,那么也是
无法实现这个
派生类的对象的。有时候需要去该
派生类的基
类中去查看。
解决办法如下:把 FastFeatureDetector fast(40);
fast.detect(image,keypoints);
改为: Ptr<FeatureDetector> fast=FastFeatureDetector::create(40);
fast->detect(image, keypoints);问题解决。...
学过C++的应该都知道C++中的抽象基类,当我们需要一个基类不能被实例化时,抽象基类就需要上场了。
它通常是通过定义至少一个纯虚函数来实现的,例如下面就是一个抽象基类的例子:
class Abstract
public:
Abstract(int data = 0){
m_data = data;
virtual int get...
MFC工程 error
C2259: “CXXXX”: 不能
实例化抽象类。
解决方法:就是需要把基
类里面的所有纯虚函数在
派生类里面全部实现,缺少一个都不行,简单实现就是子
类的头文件里面直接空实现(用不到此接口的情况下)。
例如:接口
类方法:virtual void OnUpdate() = 0;
派生类实现:virtual void OnUpdate(){};
在C++中,抽象类是指包含纯虚函数的类,它不能被实例化。纯虚函数是通过在函数声明中使用"=0"来标识的,它表示该函数在基类中没有实现,而是留给派生类去实现。因为抽象类中存在未实现的纯虚函数,所以无法创建抽象类的实例。
引用中的示例代码展示了一个抽象类Base和它的派生类Test。在这个例子中,Base类中的fun函数被声明为纯虚函数,因此Base类是一个抽象类。而在main函数中,试图实例化抽象类Base的对象a是错误的,因为抽象类不能被实例化。同样,将基类Base的地址赋给派生类Test的指针p也是错误的。
要修正这个问题,可以将a声明为Base类的指针,而不是Base类的对象。即将void main(){ Base a; Test *p; p=&a; }改为void main(){ Base *a; Test p; a=&p; }。这样,a指针可以指向派生类Test的对象,而不再试图实例化抽象类Base的对象。
引用提供了关于GDB调试工具的信息,与问题本身无直接关联,不需要在回答中引用。<span class="em">1</span><span class="em">2</span>
#### 引用[.reference_title]
- *1* [C++ 不能实例化抽象类](https://blog.csdn.net/tracyliang223/article/details/17782539)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"]
- *2* [Linux GDB C/C++调试基础与提升](https://download.csdn.net/download/keavinn/88217480)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]