标题:[原创]和kuangjingbo讨论虚拟基类的问题
只看楼主
C++大粉丝
Rank: 4
等 级:贵宾
威 望:10
帖 子:477
专家分:0
注 册:2004-4-23
 问题点数:0 回复次数:5 
[原创]和kuangjingbo讨论虚拟基类的问题

virtual 的作用就是在其派生类中只有一个共享的副本.

1.为什么添加virtual后就不能产生最后派生类的对象呢?从提示可以看出,是不能访问最基类的private访问层的构造函数(virtual base游戏规则:最基类的初始化,也就是构造函数的责任,交给最后派生类担任,明白了吧?)

所以单从实现上,完全可以将最后派生类声明成最基类的友员,从而实现顺利创建最后派生类的对象,就算是private virtual也没有问题,所以这不能从根本上实现不让派生的基类.

2.为什么去掉virtual后就能产生最后派生类的对象呢?是因为最基类的构造任务是交给直接派生类担任,而且直接派生类是最基类的友员,所以就很顺利的构造了.

搜索更多相关主题的帖子: 基类 kuangjingbo 派生类 virtual 构造 
2004-04-27 21:05
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
得分:0 
[QUOTE]

最基类的构造任务是交给直接派生类担任

[/QUOTE]

噢,我终于明白了。这一句话就是问题的答案!!

谢谢你,C++学院派成员甲!!


永不放弃!
2004-04-28 12:04
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
得分:0 

另外,问个跟这个问题不相关的问题:

首先,我知道我们写的类在好多地方都被编译器隐含的加入了一些东西。那么:

“派生类的构造函数首先调用基类的构造函数”正确吗?

还是,“编译器在构造派生类前调用基类的构造函数”(也就是派生类的构造函数与基类的构造函数之间没有调用关系)?

也就是说:

b是基类(base),d是继承类(derived)。对于d obj ; 以下有两种方案,正确的是哪个呢:

1. 编译器调用d::d();

但是d::d()被编译器改变了,它的首句被隐含的加入b::b();

还是:

2.编译器顺序的调用b::b();

d::d();

或者,以上两种都不对?


永不放弃!
2004-04-28 12:28
C++大粉丝
Rank: 4
等 级:贵宾
威 望:10
帖 子:477
专家分:0
注 册:2004-4-23
得分:0 

是编译器自动生成的,我只是指单继承的情况,切记!

例子:

class B{};

class D:public B{};

生成D的实例时编译器首先调用B(),然后调用D的成员列表,然后调用D()

也就是D():B(),D的成员列表{}

切记~是单继承,并且是只有一个派生类

如果不是,就是具体情况而定(视编译器而定)。


I am a big fan of c plus plus.
2004-04-28 17:36
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
得分:0 

也就是说在单继承的情况下,子类的构造函数 与 基类的构造函数不是隐含的调用关系,对吗??


永不放弃!
2004-04-28 21:31
C++大粉丝
Rank: 4
等 级:贵宾
威 望:10
帖 子:477
专家分:0
注 册:2004-4-23
得分:0 
呵呵~不要在“文字”上停留不前,它们在只有一个派生类的单一继承是隐含调用的关系,你想想看,派生类的对象不就是一个基类的对象吗?想想“is a”的关系,派生类的对象产生时,在派生类对象的构造函数调用之时,记住,是“之时”,调用基类的构造函数,然后是派生类的初始成员列表,然后就是派生类的构造函数里的操作,就是这样。

I am a big fan of c plus plus.
2004-04-28 22:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-941-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.088781 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved