【问题标题】:C++ Class Inheritance problemC++类继承问题
【发布时间】:2009-11-15 06:07:12
【问题描述】:

您好,我有两个类,一个叫做指令,一个叫做 LDI,它继承自指令类。

class Instruction{

  protected:
    string name;
    int value;

  public:
    Instruction(string _name, int _value){ //constructor
        name = _name;
        value = _value;
    }
    ~Instruction(){}
    Instruction (const Instruction &rhs){
        name = rhs.name;
        value = rhs.value;
    }
    void setName(string _name){
        name = _name;
    }
    void setValue(int _value){
        value = _value;
    }
    string getName(){
        return name;
    }
    int getValue(){
        return value;
    }
    virtual void execute(){}
    virtual Instruction* Clone() { 
        return new Instruction(*this); 
    }
};
/////////////end of instruction super class //////////////////////////

class LDI : public Instruction{

    void execute(){
        //not implemented yet
    }
    virtual Instruction* Clone(){
        return new LDI(*this);
    }
};

然后我创建一个指令类型的指针并尝试指向一个新的 LDI 类型的实例。

Instruction* ptr;
ptr = new LDI("test", 22);

我收到以下编译器错误。任何想法我做错了什么?

functions.h:71: error: no matching function for call to ‘LDI::LDI(std::string&, int&)’
classes.h:54: note: candidates are: LDI::LDI()
classes.h:54: note:                 LDI::LDI(const LDI&)

【问题讨论】:

    标签: c++ inheritance class copy-constructor virtual-copy


    【解决方案1】:

    代码:new LDI(name, val) 明确表示“使用nameval 调用LDI 构造函数。”

    没有采用name / val 的LDI 构造函数。 事实上,我根本没有看到 LDI 的构造函数。

    如果你想使用基类的构造函数,方法如下:

    public LDI(string _name, int _value) // Public constructor for LDI
        : Instruction(_name, _value)     // Delegate to the base-class constructor
    {
        // Do more LDI-specific construction here
    }
    

    【讨论】:

    • 请注意,C++0x 将允许使用 using 指令导入基类的构造函数,这很棒。
    【解决方案2】:
    LDI::LDI (string _name, int _value):Instruction(_name,_value){}
    

    您需要为派生类LDI 提供一个构造函数,该构造函数又会调用正确的基类构造函数。

    ptr = new LDI("test", 22);
    

    此时编译器会寻找一个LDI 构造函数,它以(string,int) 作为参数,因为编译器没有提供这样的构造函数。

    LDI(string _name, int _value)
    { 
    }
    

    通过提供派生类构造函数将解决编译问题。但默认情况下,派生类构造函数不会调用适当的基类构造函数;在这种情况下Instruction(_name,_value)(它只调用默认构造函数)。 为了调用正确的基类构造函数,您需要从派生类初始化列表中调用基类构造函数。

    所以。

    LDI::LDI (string _name, int _value):Instruction(_name,_value){}
    

    【讨论】:

      【解决方案3】:

      派生类不继承基类的构造函数、析构函数、赋值运算符、友元函数和友元类。

      【讨论】:

        【解决方案4】:

        首先,您必须为 LDI 定义和声明构造函数(字符串 _name,int _value)。您还神秘地初始化了您的基类构造函数 LDI::LDI (string _name, int _value):Instruction(_name,_value){}。 其次,如果在基类析构函数之前添加 vritual 关键字会很好。如果您的基类析构函数不是虚拟的并且您编写此代码 指令* ptr; ptr = new LDI("测试", 22); 删除*ptr;

        从未调用过 LDI 的析构函数。保持基类析构函数为虚拟,以便正确销毁对象层次结构

        【讨论】:

          猜你喜欢
          • 2012-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-11
          • 2011-09-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多