我知道这是经常被问到的问题,但我无法找到让代码工作的方法,所以我很乐意得到一些帮助。这是代码:
#include "stdafx.h"
#include "iostream"
#include "string"
#include "cmath"
#include "ctime"
using namespace std;
class quad{
int Lice;
public:
quad(int x, int z){
Lice = x*z;
}
int ShowLice(){
return Lice;
}
};
class tri : public quad{
int Lice;
public:
tri(int a, int b, int c){
Lice = a*b*c;
}
};
int main(){
quad ob1(2,2);
tri ob2(2,2,2);
cout<<ob1.ShowLice();
cout<<ob2.ShowLice();
return 0;
}
我使用VS2008,编译器的错误是:
project1.cpp(20) : error C2512: 'quad' : no appropriate default constructor available
谢谢,Leron。
答案 0 :(得分:3)
将其更改为
class quad{
protected:
int Lice;
public:
quad(int x, int z){
Lice = x*z;
}
int ShowLice(){
return Lice;
}
};
class tri : public quad{
public:
tri(int a, int b, int c) : quad(a,b) {
Lice *= c;
}
};
在派生类和基类中都没有 Lice 成员。使其受到保护,以便派生类和子类重用相同的字段。
如果基类中有非默认构造函数,则必须使用派生类构造函数中的正确参数调用基类构造函数,如上所示。
此外,如果您使用继承,最好在基类中提供virtual destructo r。在您的示例代码中,问题可能并不明显。
答案 1 :(得分:2)
您需要从quad
的初始化列表中调用tri
的构造函数:
tri(int a, int b, int c) : quad(a,b) {...
答案 2 :(得分:2)
当你构造一个类型为tri的类时,它会继承继承树并尝试创建一个四元组。它不能因为quad没有默认构造函数。要修复此错误,您可以显式调用quad的构造函数或提供将被调用的默认构造函数。
在C ++中,当没有给出构造函数时,会自动生成默认构造函数,但是一旦定义了任何构造函数,就不再自动生成默认构造函数。即使没有定义默认构造函数,也会发生这种情况。
答案 3 :(得分:0)
你是tri
构造函数试图调用quad
中的默认构造函数。您没有添加此代码,编译器为您确保正确初始化基类。
由于没有默认构造函数,因此您必须显式调用要使用的基础中的构造函数,即使只有一个构造函数。你会这样做的:
tri(int a, int b, int c) : quad(a,b){
Lice = a*b*c;
}
或者您希望传递给quad
的任何适当参数。