具有2个派生类的基类 - 如何正确构造?

时间:2012-08-19 09:25:40

标签: c++

我有3节课。我们称它们为A类,B类和C类。

C类继承自B类,B类继承自A类。(还有其他类继承自B类)

EG
classC -> classB -> classA
classD -> classB -> classA
classE -> classB -> classA

我想创建一个C类对象。

A类有一个变量'name' B类有一个变量'choice'

我希望C类对象的构造函数能够创建具有给定名称的对象。

这就是我完成我的.h文件的方式(显然不起作用)这些摘录来自相关的.h文件。我有一个.h文件和每个类的.cpp文件。

class classC: public classB {
public:
    classC(string name):classA(name){}
};

class classB : public classA {
public: 
classB(string name);
void setChoice();
    string getChoice(); 

protected:
    string choice;
};

class classA {
public:
    classA();
    classA(string name);
    string getName();
    virtual void setChoice();

protected:
    string name;
};

.cpp文件的摘录如下:

ClassC **

classC::classC(string name) {}

void classC::setChoice() {
choice = "P";
}

ClassB **

classB::classB(string name):classA(name){}

string classB::getChoice(){
    return choice;
}

void classB::setchoice(string newChoice){
    choice = newChoice;
}

* ClassA *

classA::classA() {}

classA::classA(string aName):name(aName){}

string classA::getName() {
    return name;
}
void classA::setSelection() {}

驱动:

classC* classC1 = new classC("tomato");
class1C->setChoice();
cout << "Name is " << classC1->getName() << endl;
cout << "Choice is " << classC1->getChoice() << endl;

我将setChoice方法设置为虚拟,因为我希望C类 - Z类中的每个类都有自己特定的setChoice函数。该项目的规范还规定必须在ClassA中声明此函数。

我收到一条错误,指出ClassB需要1个参数,并且没有提供任何参数。

有人可以指出我正确的方向。我没有想法。

1 个答案:

答案 0 :(得分:4)

您的第一个错误是您必须在定义派生类之前定义基类。

第二个问题是你只能调用直接碱基的构建者。也就是说,在C类的构造函数中,您必须调用classB的构造函数,然后可以将参数传递给classA。所以完整的代码看起来像这样:

class classA {
public:
    classA();
    classA(string name);
    string getName();
    virtual void setChoice();

protected:
    string name;
};

class classB : public classA {
public: 
classB(string name): classA(name){}
void setChoice();
    string getChoice(); 

protected:
    string choice;
};

class classC: public classB {
public:
    classC(string name):classB(name){}
};