| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2495 人关注过本帖
标题:[求助]虚继承的问题
取消只看楼主 加入收藏
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
 问题点数:0 回复次数:6 
[求助]虚继承的问题

class Usable;
class Usable_lock
{ //这家伙把这个类的构造函数声明为私有并把Usable类声明为他的友元
friend class Usable;
private:
Usable_lock() {}
Usable_lock(const Usable_lock&) {}
};

class Usable : public virtual Usable_lock //虚继承Usable_lock类
{ // ...
public:
Usable();
Usable(char*); // ...
};

class DD : public Usable
{ };
int main()
{
Usable a;
DD dd; //错误!因为 DD 不能访问 Usable_lock 的构造函数,也就创建不了 dd,防止了Usable被继承
return 0;
}
//这里的如果Usable不是虚继承基类的话DD dd;就不会错,虚继承决定了什么?!
搜索更多相关主题的帖子: Usable lock class 继承 public 
2007-05-31 09:27
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
得分:0 
这种情况下,derive3就同时拥有了两套base的函数。所以在调用时产生的模糊性会使程序出错。具体我就不谈那么多了。

也不用谈了,菱形的二义性,基本了解
谢谢斑竹的分析
补足了我继承与派生方面的知识,其实我记得教材有的,但是怎么翻也翻不到,百度出来也是一堆乱七八糟

[此贴子已经被作者于2007-5-31 15:50:48编辑过]


Viva,espana!
2007-05-31 15:43
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
得分:0 
以下是引用wfpb在2007-5-31 22:04:45的发言:

在存在虚拟继承的继承结构层次中:子类的构造函数必须在初始化列表中将他所有的直接基类以及非直接虚基类都进行构造(如果是默认构造可以忽略)。
如下:

#include <iostream>
using namespace std;

class A
{
public:
A(int a){cout<<\"A::Constructor\"<<endl;}
};
class B:public virtual A
{
public:
B(int b):A(b){cout<<\"B::Constructor\"<<endl;}
};
class C:public B
{
public:
C(int c):A(c),B(c){cout<<\"C::Constructor\"<<endl;}//很显然,A(c)要在初始化列表中写出来
//因此就是C(int)调用A(int),所以在LZ的代码中失败!
};
void main()
{
C c(0);
}



我的例子是BJ大叔防止自己的类被继承的本意就是要DD dd不成功,我只是问虚继承的问题


Viva,espana!
2007-05-31 22:31
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
得分:0 
以下是引用wfpb在2007-6-2 1:35:32的发言:
是啊,我是说明为什么会调用失败的原因,因为子类要在初始化列表中构造他所有的直接基类以及非直接虚基类。
而Usable_lock()这个非直接虚拟基类的构造函数是无参构造函数,可以省略,所以在class DD中就没有显示写出,但是其实是存在的,也即是说DD类的构造函数是这样的:
DD:Usable_lock(),Usable(){}

之前已经明白了......


Viva,espana!
2007-06-02 22:48
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
得分:0 
以下是引用wfpb在2007-6-3 15:15:36的发言:
哦,不好意思,我累赘了!

没有啊,我只是以为你认为我问怎样才能使之编译通过


Viva,espana!
2007-06-03 16:40
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
得分:0 
以下是引用kisscjy在2007-6-3 21:41:32的发言:
学到东西了~~~谢谢~~~

原来虚继承会调转继承顺序滴~~~

你的签名真有趣


Viva,espana!
2007-06-04 09:46
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
得分:0 
回复:(zakker)class Usable;class Usable_lock { ...
因为继承顺序的问题,所以DD通过他“父亲”调了“爷爷”的函数

Viva,espana!
2007-06-07 22:28
快速回复:[求助]虚继承的问题
数据加载中...
 
   



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

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