首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ 承继类

2013-09-08 
C++ 继承类有四个类 A , B, C , DA 是基类,B, C 都继承A, D是继承B ,C 的类;我的写法是这样的:#includeio

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++语言本身能支持。

热点排行