读书人

C++ 承继类

发布时间: 2013-09-08 15:21:21 作者: rapoo

C++ 继承类
有四个类 A , B, C , D
A 是基类,B, C 都继承A, D是继承B ,C 的类;

我的写法是这样的:


#include<iostream>
using namespace std;

class A{
public:
int a;
A(int n) {
a = n;
cout<<"A::a="<< a <<endl;
}
};

class B:public A{
public:
int b;
B(int a0 , int n) :A(a0){
b = n;
cout<<"B::b="<< b <<endl;
}
};

class C: public A{
public:
int c;
C(int a0, int n) :A(a0){
c = n;
cout<<"C::c="<< c <<endl;
}
};

class D: public B , public C {
public:
int d;
A(int a0 , int b0 , int c0 , int d0) : B(a0,b0) , C(a0,c0){
// 上面的这一句出错了, 平时单继承的时候就是这样写的,这个不知道怎么
d = d0;
cout<<"D::d="<< d <<endl;
}
};


注释里说的那样, 那里编译出错,哪位高手指点一下!!!(急需) C++ 继承


[解决办法]
最后构造函数错了A(int?a0?,?int?b0?,?int?c0?,?int?d0)??:?B(a0,b0)?,?C(a0,c0)
应该是D{}啊 你写A了。
[解决办法]

菱形继承。


#include <iostream>

using namespace std;

class A
{
public:
int a;
A(){}
A(int n)
{
a = n;
cout<<"A::a="<< a <<endl;
}
};

class B: virtual public A{
public:
int b;
B(int a0 , int n) :A(a0){
b = n;
cout<<"B::b="<< b <<endl;
}
};

class C: virtual public A{
public:
int c;
C(int a0, int n) :A(a0){
c = n;
cout<<"C::c="<< c <<endl;
}
};

class D: public B , public C {
public:
int d;
D(int a0 , int b0 , int c0 , int d0) : A(a0), B(a0,b0) , C(a0, c0)
{
d = d0;
cout<<"D::d="<< d <<endl;
}
};

int main()
{
D d(1, 2, 3, 4);

return 0;
}


[解决办法]
用我的代码试一试, 如果不可以,说明是你编译器的问题。我的代码通过了vc 2012和g++
引用:
Quote: 引用:


菱形继承。


那里注意到了,不过有测试例子编译不行啊?


int main(int argc, const char *argv[])
{
A* a = new A(1);
delete a;
cout << endl << endl;

a = new B(2, 3);
delete a;
cout << endl << endl;

a = new C(4, 5);
delete a;
cout << endl << endl;

// a = new D(6, 7, 8, 9);
// delete a;
// 就是这个地方便易老出问题 怎么回事儿?
getchar();
return 0;


}



编译错误是这样说的:DEV-CPP\未命名2.cpp `A' is an ambiguous base of `D'
怎么改进 啊?

[解决办法]
引用:
1,类A 有必要写个不带参数的A(){ } 吗?
2,class B: virtual public A{.....
}
class C: virtual public A{
.....
}
这里为什么把类A设成virtual 呢???
3,D(int a0 , int b0 , int c0 , int d0) : A(a0), B(a0,b0) , C(a0, c0) {
A 类的参数设置已经通过B,C做好了,为什么还要写个A(a0);


1. 默认构造函数不是必须的,可以删除.
2. 虚继承是为了避免菱形继承中重复继承. 这里 xxx: virtual public A{ //A成为虚基类
3. 虚拟继承是先构造虚基类(A),再构造其直接基类(B,C,此时B,C不会再构造A).

我们提倡简单的继承,要避免多重继承,虽然c++语言本身能支持。

读书人网 >C++

热点推荐