+ -
当前位置:首页 → 问答吧 → 还是不太理解继承中的构造函数 再问一下

还是不太理解继承中的构造函数 再问一下

时间:2011-12-12

来源:互联网

class Base
{
public:
  Base(int i)
  {}
};

class Dervice:public Base
{
public:
  Dervice():Base(10){}//这个地方 是子类的初始化列表 这里写"Base(10)" 不就是对基类构造函数的调用吗?既然是对基类构造函数的调用 是否就说明了子类中继承了基类的构造函数呢?
};

作者: daihenan   发布时间: 2011-12-12

不一定啊。
参数不同的形成多态,根据参数确定执行那个构造函数;
参数相同的,先判断是否是虚函数,仔细看看定义吧

作者: jubobo   发布时间: 2011-12-12

基类的构造函数是不能被派生类继承的。另外你派生类构造函数写的不对
Dervice(i):Base(10)
基类的构造函数带参数的话,派生类构造函数也一定要带参数

作者: wjl19890711   发布时间: 2011-12-12

C/C++ code

#include <iostream>
using namespace std;
class base
{
    public:
    base(int i):num(i){}
    base(const base &orig):num(orig.num){}
    base& operator = (const base &orig)
    {
        num = orig.num;
        return *this;
    }
    private:
    int num;
};
class derived:public base
{
    public:
    derived(int a,int b):base(a),id(b)
    {

        //base::base(a);//或者换成base(a);<<----    base::base(a);测试是否被继承并应藏,base(a);测试是否被继承没有隐藏,结果全部编译错误
        //id = b;
    }
    derived(const derived &orig):base(orig),id(orig.id)
    {
        //base::base(orig);//或者换成base(orig);<<-----同上,结果全部编译错误
        //id = orig.id;
    }
    derived& operator = (const derived &orig)
    {
        base::operator = (orig);//<<--------通过,说明这个被继承但被隐藏
        id = orig.id;
        return *this;
    }
    private:
    int id;
};

int main()
{
    return 0;
}

测试发现
初始化列表中调用构造函数和在函数体内部调用构造函数是有区别的,对于构造函数的调用编译器确实做了手脚,插入了代码,你直接调用反而出错,编译器只允许在初始化列表里调用
operater = 操作确实是被继承了,你可以正常的去调用,只是被隐藏了,析构函数和构造函数是一样的不再做分析
哥为这个派生类对象模型的问题研究了整整三天,这是最终结论,看楼下怎么说!

作者: qscool1987   发布时间: 2011-12-12

引用 3 楼 qscool1987 的回复:
C/C++ code


#include <iostream>
using namespace std;
class base
{
public:
base(int i):num(i){}
base(const base &amp;orig):num(orig.num){}
base&amp; operator = (const base &a……


兄弟 你这个研究结果很有说服力呀 三天整出来 也够累的了 但 derived(int a,int b):base(a),id(b)
这样写不就是对base构造函数的调用么??

作者: daihenan   发布时间: 2011-12-12