抽象类构造函数问题

pengpeng2025 2012-07-24 01:34:11

enum Size{Mini, Medium, Full};
class CVehicle{
public:
CVehicle(Size s = Medium, int n = 0) : size(s), nSpotsNeeded(n) {}
protected:
Size size;
int nSpotsNeeded;
};

class CBus : public CVehicle{
public:
CBus() : CVehicle(Full, 5) {}
};


请问怎么在没其他虚函数的情况下把基类CVehicle声明为抽象类。。构造函数显然不能成为虚函数,还有其他办法么?是否把析构函数变纯虚?

这种没多态动作的继承是不是不好?
...全文
199 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zfk198687 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用楼主 的回复:
C/C++ code

enum Size{Mini, Medium, Full};
class CVehicle{
public:
CVehicle(Size s = Medium, int n = 0) : size(s), nSpotsNeeded(n) {}
protected:
Size size;
int nSpotsNeeded;
};

……
[/Quote]
++,既然没多态动作,楼主强制转换成抽象类做什么呢?
pathuang68 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
C/C++ code

enum Size{Mini, Medium, Full};
class CVehicle{
public:
CVehicle(Size s = Medium, int n = 0) : size(s), nSpotsNeeded(n) {}
protected:
Size size;
int nSpotsNeeded;
};

class ……
[/Quote]

一般来讲如果一个类要作为基类,最好将其析构函数设为virtual的,否则就有可能会造成内存泄露,这是一般的惯例。如欲知其所以然,可参考:
虚析构函数问题:为什么要将基类的的析构函数设成虚的?

如果没有其它成员函数需要设为纯虚函数,那么这个类最好就不要强行使之为抽象类。
q2920 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

C/C++ code

#include <iostream>
using namespace std;
enum Size{Mini, Medium, Full};
class CVehicle{
public:
CVehicle(Size s = Medium, int n = 0) : size(s), nSpotsNeeded(n) {}
virtual~CVehicl……
[/Quote]++
Flammable_ice 2012-07-24
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
enum Size{Mini, Medium, Full};
class CVehicle{
public:
CVehicle(Size s = Medium, int n = 0) : size(s), nSpotsNeeded(n) {}
virtual~CVehicle()=0;//完全可以把析构函数设置为纯虚函数,编译能够通过的。
protected:
Size size;
int nSpotsNeeded;
};
class CBus : public CVehicle{
public:
CBus() : CVehicle(Full, 5) {}
};
void main()
{

}

//这个貌似就成了抽象类吧?我不明白的是为什么非要把基类变成抽象类?就是普通的继承就OK了,不明白楼主这么做的目的
pengpeng2025 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
C/C++ code

#include <iostream>
using namespace std;
enum Size{Mini, Medium, Full};
class CVehicle{
public:
CVehicle(Size s = Medium, int n = 0) : size(s), nSpotsNeeded(n) {}
virtual~C……
[/Quote]

还应该加上CVehicle::~CVehicle() {} 因为继承类析构时会调用基类析构函数,所以还需要基类析构实现。想变成抽象类是因为不想有CVehicle类的实例化出现。不过没多态动作的继承确实是不好
FrankHB1989 2012-07-24
  • 打赏
  • 举报
回复
既然定义了(纯)虚函数,就是多态类了。如果不打算运行时多态,一开始就不用虚函数。如果还是想用类似抽象类的编译期的定义存在性约束,可以用类模版成员来匹配,比较麻烦点。
FrankHB1989 2012-07-24
  • 打赏
  • 举报
回复
可以。
不过注意对于析构函数,即便是纯虚函数,也需要定义,否则没法odr-use,用了链接错误。(普通纯虚成员函数的定义倒是可有可无。)
www_adintr_com 2012-07-24
  • 打赏
  • 举报
回复
把构造函数定义成 protected 的

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧