[英]C++ Class Inheritance problem
嗨,我有两个类,一个叫做指令类,一个叫做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);
}
};
然后,我创建一个Instruction类型的指针,并尝试指向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&)
代码: new LDI(name, val)
专门说“用name
和val
调用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
}
LDI::LDI (string _name, int _value):Instruction(_name,_value){}
您需要为派生类LDI
提供构造函数,而后者又调用正确的基类构造函数。
ptr = new LDI("test", 22);
此时,编译器正在寻找一个以(string,int)
作为参数的LDI
构造函数,因为没有提供编译器婴儿床的此类构造函数。
LDI(string _name, int _value)
{
}
通过提供派生类的构造函数将解决编译问题。 但是默认情况下,派生类构造函数不会调用适当的基类构造函数; 在这种情况下, Instruction(_name,_value)
(它仅调用默认构造函数)。 为了调用正确的基类构造函数,您需要从派生类初始化器列表中调用基类构造函数。
所以。
LDI::LDI (string _name, int _value):Instruction(_name,_value){}
派生类不会继承基类的构造函数,析构函数,赋值运算符,朋友函数和朋友类。
首先,您必须定义并声明LDI的构造函数(字符串_name,int _value)。 您还需要初始化基类构造函数LDI :: LDI(字符串_name,整数_value):Instruction(_name,_value){}。 其次,如果在基类析构函数之前添加vritual关键字会很好。 如果您的基类析构函数不是虚拟的,那么您可以编写以下代码: ptr = new LDI(“ test”,22); 删除* ptr;
LDI的析构函数从未调用过。 保持基类析构函数为虚拟,以正确销毁对象的层次结构
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.