c++ 继承性,子类调用父类的构造函数问题

来源:百度知道 编辑:UC知道 时间:2024/05/23 12:34:03
#include<iostream>

using namespace std;

class person
{
public :

person(char* n)
{
name = n;
}

void print()

{
cout<<name<<endl;
}

private:
char *name;
};

class police:public person
{
public :
police(char* n, char* m ):ps(n), major(m)
{
cout<<"police called"<<endl;
}

void print()
{
person::print();
cout<<major<<endl;
}

private:
person ps;
char* major;
};

void main()
{
police economical("renchangxia", "economical");
economical.print();
}

1>c:\documents and settings\administrator\my documents\visual studio 2005\projects\first\first\extends.cpp(30) : error C2512: 'person' : no appropriate default constr

加一句:你的问题,跟你的标题好像一点联系也没有.
===============================================
因为如果你要定义一个person,假如像这样定义.
person p1;
那么p1就会调用person的默认构造函数进行初始化.如果你没有当然会报错.

也就是说,如果你没有默认构造函数,就不能像上面那样定义一个类的实例.
我是这样认为.

像你的这个person类可以这样定义一个实例,也仅能这样.
person p1("zs");

根据上面说的,你的代码如下:
private:
person ps;
char* major;
是不对的.明白否?

同意楼上,问题出在这句:
person ps;

当没有构造函数时,类提供一个默认的无参构造函数.当有了自定义的构造函数时.类就不会再提供无参构造函数.也就是当构造police时,运行到上面那句,需到person里面去找无参构造函数,对ps初始化,而你的person类里没有.所以会产生错误.解决的方法有两种:
1.在person里面加一个无参构造函数.
2.声明person ps("none")

把police里面的person ps;注释掉,
再把police(char *n, char *m ):ps(n), major(m)改成police(char *n, char *m ):person(n), major(m)

你把派生类该一下就好了,把ps(n)该为person(n)