抽象类构造函数问题

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声明为抽象类。。构造函数显然不能成为虚函数,还有其他办法么?是否把析构函数变纯虚?

这种没多态动作的继承是不是不好?
...全文
155 点赞 收藏 8
写回复
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 的
回复
发动态
发帖子
C++ 语言
创建于2007-09-28

5.9w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
社区公告
暂无公告