【请问】抽象类构造函数可以相互调用吗?

HeBanBei 2016-04-28 11:09:47

一个抽象类C,有两个构造函数,分别是C(void), C(const string str)
在C(const string str)中调用C(void), 编译时报错:不能实例化抽象类
这到底是怎么回事?
...全文
112 点赞 收藏 9
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fefe82 2016-04-28
引用 3 楼 lm_whales 的回复:
抽象类不能构造完整的对象,除非用于继承 才可以 用抽象类 的构造函数,初始化抽象基类子对象 这么做是为了保证 不用 抽象类构造独立的对象。 所以C++11 虽然允许 一个构造函数借用另外一个构造函数,也不允许抽象类这么做。 C++11 以前 的标准,,,0x 属于非正式标准,不算 构造函数不可以,用于另一个构造函数的初始化
抽象类也是可以的。
回复
lm_whales 2016-04-28
这样没太多关系,因为类内部定义的函数,一般都相当于内联函数 很容易把函数调用优化掉,但是多写一个函数显得不够优雅 C++11 干脆就可以转发构造函数 一个构造函数,可以使用另一个。 你可以,设置缺省值,虽然设置缺省值也不太好, 比写两个构造函数还是简单点 抽象类,为何要用两个构造函数 毕竟,派生类要用抽象类去构造他的基类子对象,保持统一不好么?
回复
HeBanBei 2016-04-28
引用 5 楼 lm_whales 的回复:
抽象类本身不可以创建对象 调用另一个构造函数本身就是创建对象 用于初始化派生类时,是构造派生类过程的一个步骤 用于同一个类,或者另一个抽象类的时候,还没有定义派生类 编译器只能断为创建新对对象。所以出错。 抽象类唯一存在的理由是,派生一个类, 继承他的(所有)接口, 只要有一个接口函数没实现 派生类依然是抽象类 抽象类的代码本身,在没有实现派生类的情况下,是毫无用途的。
嗯,你这么说我明白了。 但是我想到一个问题: 如果一个构造函数的一部分代码与另一个构造函数完全相同, 那么就存在两份相同的代码在两个构造函数中。 这样维护起来不是很好。 于是,我想,可以另设一个函数,把相同的部分放进去。 然后两个构造 函数都调用这个新设的函数。 这样好像解决了保存两份相同代码在两个构造 函数中的问题。 但是,这种解决方式好像有点不太直接。 因为对于构造 函数 C(void),它平白无故多了一次函数调用。 如果不是因为它是抽象类,我基本不会用这样的方式。 所以,我又想,C++这么设计,是不是还有什么门道在里面? 比如说,会不会有什么办法比在抽象类中设置两个构造函数更好?
回复
lm_whales 2016-04-28
抽象类本身不可以创建对象 调用另一个构造函数本身就是创建对象 用于初始化派生类时,是构造派生类过程的一个步骤 用于同一个类,或者另一个抽象类的时候,还没有定义派生类 编译器只能断为创建新对对象。所以出错。 抽象类唯一存在的理由是,派生一个类, 继承他的(所有)接口, 只要有一个接口函数没实现 派生类依然是抽象类 抽象类的代码本身,在没有实现派生类的情况下,是毫无用途的。
回复
HeBanBei 2016-04-28
引用 3 楼 lm_whales 的回复:
抽象类不能构造完整的对象,除非用于继承 才可以 用抽象类 的构造函数,初始化抽象基类子对象 这么做是为了保证 不用 抽象类构造独立的对象。 所以C++11 虽然允许 一个构造函数借用另外一个构造函数,也不允许抽象类这么做。 C++11 以前 的标准,,,0x 属于非正式标准,不算 构造函数不可以,用于另一个构造函数的初始化
还有一个问题,为什么抽象类构造函数之间的相互调用会造成抽象类构造独立的对象?
回复
lm_whales 2016-04-28
抽象类不能构造完整的对象,除非用于继承 才可以 用抽象类 的构造函数,初始化抽象基类子对象 这么做是为了保证 不用 抽象类构造独立的对象。 所以C++11 虽然允许 一个构造函数借用另外一个构造函数,也不允许抽象类这么做。 C++11 以前 的标准,,,0x 属于非正式标准,不算 构造函数不可以,用于另一个构造函数的初始化
回复
HeBanBei 2016-04-28
引用 1 楼 qq423399099 的回复:
抽象类不能实例化。 类还有虚函数未实现,所以无法实例化
你说的我理解了。但还有问题,构造函数相互调用与实例化有什么关系 ?
回复
小灸舞 2016-04-28
抽象类不能实例化。
类还有虚函数未实现,所以无法实例化
回复
lm_whales 2016-04-28
引用 8 楼 fefe82 的回复:
[quote=引用 3 楼 lm_whales 的回复:] 抽象类不能构造完整的对象,除非用于继承 才可以 用抽象类 的构造函数,初始化抽象基类子对象 这么做是为了保证 不用 抽象类构造独立的对象。 所以C++11 虽然允许 一个构造函数借用另外一个构造函数,也不允许抽象类这么做。 C++11 以前 的标准,,,0x 属于非正式标准,不算 构造函数不可以,用于另一个构造函数的初始化
抽象类也是可以的。[/quote] 这样啊,那就是楼主没使用C++11,C++14
回复
发动态
发帖子
C++ 语言
创建于2007-09-28

5.9w+

社区成员

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