我检查了类继承语法,我很确定我没有错误?做了什么从我身边溜走了?
class person
{
public:
int personid;
string personname;
string personadress;
person( int apersonid, string apersonname, string apersonadress )//constructor
{
personid=apersonid;
personname=apersonname;
personadress=apersonadress;
}
int getpersonid()
{
return personid;
}
string getpersonname()
{
return personname;
}
string getpersonadress()
{
return personadress;
}
};
class employee: public person
{
public:
int commission;
employee(int _commission, int apersonid, string apersonname, string apersonaddress) : person(apersonid, apersonname, apersonaddress)
{
commission= _commission;
}
int getcommission()
{
return commission;
}
};
我得到的错误是
错误1错误C2512:'person':没有合适的默认构造函数 可用
答案 0 :(得分:2)
我怀疑你的问题是你的基类没有定义默认构造函数(带有0个参数)。相反,你有一个带有多个参数的构造函数。
person( int apersonid, string apersonname, string apersonadress )//constructor
{
personid=apersonid;
personname=apersonname;
personadress=apersonadress;
}
您的员工类继承自人,但它的构造函数只接受一个参数,并且不使用它的构造函数初始化基类。
employee( int _commission )
{
commission= _commission;
}
当您创建员工实例时,这是一个问题b / c,它也试图调用人员类构造函数。由于您没有默认构造函数(同样没有参数),因此您需要在员工构造函数中显式调用person构造函数。
您有两种选择。
首先,修改person构造函数以不带参数
person()
如果您使用此方法,您的员工类的签名将不会发生变化。
或者您可以修改员工构造函数以获取人员构造函数所需的所有参数:
class employee: public person
{
public:
int commission;
employee(int _commision, int apersonid, string apersonname, string apersonadress ) : person(apersonId, apersonname, apersonadress)
{
commission = _commission;
}
int getcommission()
{
return commission;
}
};
在构造函数中,冒号(:)之后的代码是使用指定的参数(apersonid,apersonname,apersonadress)调用person构造函数。
然后,员工构造函数会分配_commission的值,因为它的范围仅与员工类相关。
这有意义吗?
答案 1 :(得分:1)
在C ++中,如果为类显式定义了构造函数,但它们都是非默认的,则编译器不会隐式定义默认构造函数,从而导致类没有默认构造函数。您已在类中定义了一个非默认构造函数,即:
person( int apersonid, string apersonname, string apersonadress )
所以你需要自己定义一个默认构造函数。 E.g。
person() {}
请记住,在这种情况下,当您构造employee
类的对象时,将调用person
的默认构造函数。如果不需要,则需要在person
的构造函数中调用employee
的非默认构造函数。